• Python——函数


    1、函数定义

    (1)函数:完成特定功能的一个语句组,通过调用函数名来完成语句组的功能。

    为函数提供不同的参数,可以实现对不同数据的处理

    函数可以反馈结果

    (2)分类:

    自定义函数:用户自己编写的

    系统自带函数: Python内嵌的函数(如abs()、eval())、 Python标准库中的函数(如math库中的sqrt())、图形库中的方法(如myPoint.getX())等

    (3)函数定义:使用def语句
    def <name>(<parameters>):
          <body>

    函数名<name>:可以是任何有效的Python标识符

    参数列表<parameters>:是调用函数时传递给它的值(可以由多个,一个,或者零个参数组成,当有多个参数时,各个参数用逗号分隔)

     参数个数大于等于零,多个参数由逗号分隔

    (4)形参,实参

    形式参数:定义函数时,函数名后面圆括号中的变量,简称“形参”。形参只在函数内部有效

    实际参数:调用函数时,函数名后面圆括号中的变量,简称 “实参”。 

    2、示例

    1 def happy():
    2     print("happy birthday to you!")
    3 
    4 def sing(person):
    5     print("happy birthday to "+person+' !')
    6 happy()
    7 happy()
    8 sing('hanmeimei')
    9 happy()

    调用两个函数

    1 def sing(person):
    2     print("happy birthday to you!")
    3     print("happy birthday to you!")
    4     print("happy birthday to "+person+' !')
    5     print("happy birthday to you!")
    6 
    7 sing('hanmeimei')

    只调用一个函数的程序,明显比两个函数要繁琐,所以重复性质的代码,定义函数可以减少工作量。

     3、函数的返回值

    return语句:程序退出该函数,并返回到函数被调用的地方。return语句返回的值传递给调用程序

     

    Python函数的返回值有两种形式:

    返回一个值

    返回多个值 

    (1)无返回值的return语句等价于return None。

    (2)返回值可以是一个变量,也可以是一个表达式。

    1 def square(x):
    2     y=x*x
    3     return y
    4 def square1(x):
    5     return x*x
    6 a=square(2)
    7 b=square1(3)
    8 print(a)
    9 print(b)

    (3)三角形周长函数

     

     1 import math
     2 
     3 def square(x):
     4     return x*x
     5 def distance(x1,y1,x2,y2):
     6     L=math.sqrt(square(x1-x2)+square(y1-y2))
     7     return L
     8 def isTriangle(x1,y1,x2,y2,x3,y3):
     9     flag=((x1-x2)*(y3-y2)-(x3-x2)*(y1-y2))!=0
    10     return flag
    11 
    12 def main():
    13     print("输入三个点的坐标:")
    14     x1,y1=eval(input("x1,y1="))
    15     x2,y2=eval(input("x2,y2="))
    16     x3,y3=eval(input("x3,y3="))
    17     if (isTriangle(x1,y1,x2,y2,x3,y3)):
    18         perim=distance(x1,y1,x2,y2)+distance(x1,y1,x3,y3)+distance(x2,y2,x3,y3)
    19         print('the primeter is ',perim)
    20     else:
    21         print('this is not triangle')
    22 main()

     

     1 import math
     2 
     3 def square(x):
     4     return x*x
     5 def distance(x1,y1,x2,y2):
     6     L=math.sqrt(square(x1-x2)+square(y1-y2)) #嵌套了求平方的函数
     7     return L
     8 def isTriangle(x1,y1,x2,y2,x3,y3):
     9     if ((x1-x2)*(y3-y2)-(x3-x2)*(y1-y2))!=0: #比例算法,三点在不在一条线
    10         return 1
    11 
    12 def main():
    13     print("输入三个点的坐标:")
    14     x1,y1=eval(input("x1,y1="))
    15     x2,y2=eval(input("x2,y2="))
    16     x3,y3=eval(input("x3,y3="))
    17     if (isTriangle(x1,y1,x2,y2,x3,y3)):
    18         perim=distance(x1,y1,x2,y2)+distance(x1,y1,x3,y3)+distance(x2,y2,x3,y3)
    19         print('the primeter is:{0:0.3f}'.format(perim))
    20         print('the primeter is %0.3f'%perim)#两种输出方法
    21     else:
    22         print('this is not triangle')
    23 main()

     

    将简化后的判断是否是三角形的布尔语句补充完整了,用了两种输出方式来输出内容;注意将比例式写成乘法式简化判断条件。

    4、函数的返回值return

    (1)

    1 def isTriangle(num):
    2     if num!=0: #比例算法,三点在不在一条线
    3         return 1
    4     else:
    5         return 0
    6     
    7 a=eval(input("输入数字:"))
    8 print(isTriangle(a))

    def isTriangle(num):
        if num!=0: #比例算法,三点在不在一条线
            return 1
        
    a=eval(input("输入数字:"))
    print(isTriangle(a))

    不符合条件时输出None。

     

    1 def isTriangle(num):
    2     length=num!=0
    3     return length
    4     
    5 a=eval(input("输入数字:"))
    6 print(isTriangle(a))

    length=num!=0,这个布尔表达式,是先判断num是否等于0,如果不等于零,则True,如果等于0,则False,length等于这两种情况。

    (2)

    1 def addinterest(balance,rate):
    2     newBalance=balance*(1+rate)
    3     return newBalance
    4 def main():
    5     amount=1000
    6     rate=0.05
    7     amount=addinterest(amount,rate)
    8     print(amount)
    9 main()

    (3)单个数和列表返回数的区别

    1 def addinterest(balance,rate):
    2     balance=balance*(1+rate)
    3     
    4 def main():
    5     amount=1000
    6     rate=0.05
    7     addinterest(amount,rate)
    8     print(amount)
    9 main()

    可以看出函数形参的值并没有返回给实参,所以最后出来的还是1000,需要像上面的程序一样,明确表明返回值,才能运行出来1050.

    1 def addinterest(balances,rate):
    2     for i in range(len(balances)):
    3         balances[i]=balances[i]*(1+rate)
    4 def main():
    5     amounts=[1000,900,830,400]
    6     rate=0.05
    7     addinterest(amounts,rate)
    8     print(amounts)
    9 main()

    对比上面,数组类型的值可以直接返回。视频中介绍说是原来数值被掩盖,本质原理搞不懂。?????

    将这段代码改为有返回值的情况如下。

     1 def addinterest(balances,rate):
     2     for i in range(len(balances)):
     3         balances[i]=balances[i]*(1+rate)
     4     return balances
     5 def main():
     6     amounts=[1000,900,830,400]
     7     rate=0.05
     8     amounts=addinterest(amounts,rate)
     9     print(amounts)
    10 main()

    (4)函数的拆分

     1 print("this program plots the growth of a 10-years investment")
     2 #principal=eval(input("enter the initial principal"))
     3 #apr=eval(input("enter the annualized interest rate"))
     4 principal=1000
     5 apr=0.2
     6 for year in range(1,11):
     7     principal=principal*(1+apr)
     8     print("%2s"%year,end='')#前面是输出年份,后者是保留一行
     9     total=int(principal*4/1000) #四个~代表1000
    10     print("~"*total)#前面是输入符号,后面是数量,中间用*链接
    11 print("0.0k                2.5k                5.0k                7.5k                10.0k")

    将部分功能拆分出来,形成单独函数

     1 def totalnum(principal):
     2     total=int(principal*4/1000)
     3     return total
     4 
     5 def creatTable(principal,rate):
     6     for year in range(1,11):
     7         principal=principal*(1+rate)
     8         print("%d"%year,end="")
     9         total=totalnum(principal)
    10         print("~"*total,end='')
    11         print("%.2f"%principal)
    12 
    13 def main():
    14     principal=1000
    15     apr=0.2
    16     creatTable(principal,apr)
    17 
    18 main()

    注意,想要不换行的联接 end='',输入符号‘~’*num,的形式

     5、递归

    (1)递归的定义
    递归不是循环

    最后计算基例:0!。 0!是已知值

    递归定义特征 :有一个或多个基例是不需要再次递归的;所有的递归链都要以一个基例结尾。 

    (2)阶乘

    1 def fact(n):
    2     if n==0:
    3         return 1
    4     else:
    5         return n*fact(n-1)
    6 n=2
    7 print(fact(n))

    递归和循环不一样,递归时多次调用一个函数,而循环是在一个函数中多次重复计算。

    (3)字符串反转

    Python列表有反转的内置方法

    方法1:字符串转换为字符列表,反转列表,列表转换回字符串

    方法2:递归

    1 def reverse(s):
    2     if s=="":
    3         return s
    4     else:
    5         return s[1:]+s[0]
    6 
    7 s='hello'
    8 s=reverse(s)
    9 print(s)

    一定要给递归一个初值,要不会造成死循环。

    (4)树

     1 from turtle import *
     2 
     3 def tree(plist,l,a,f):#l 画的初始长度,a角度
     4     if l>5:
     5          lst=[]
     6          for p in plist:
     7              
     8              p.forward(l)
     9              q=p.clone()#克隆p
    10              p.left(a)
    11              q.right(a)
    12              lst.append(p)
    13              lst.append(q)
    14          tree(lst,l*f,a,f)
    15 
    16 def main():
    17     p=Turtle()
    18     p.color('green')
    19     p.pensize(5)
    20     p.hideturtle() #隐藏箭头
    21     p.speed(9)
    22     #p.getscreen().tracer(3,0)
    23     p.left(90)  #向左转90度,竖直向上
    24     p.penup() #提起画笔
    25     p.goto(0,-200) #
    26     p.pendown()
    27     t=tree([p],110,65,0.6375)
    28 
    29 main()

  • 相关阅读:
    Android 源码阅读之MMS细读TransactionService.java
    [Java2 入门经典]第16章 线程
    Android 源码阅读之建立3G网络流程
    从架构上看Android多媒体播放器
    Android 开发日志之仿三星Launcher
    非常适合OA系统的菜单
    模拟动网当前位置下拉菜单
    模拟windows菜单选项卡效果
    TreeView的各种操作
    ASCII表
  • 原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/7355588.html
Copyright © 2020-2023  润新知