语法格式:def 函数名([参数列表] :
函数体
注意:圆括号后的冒号不能少,圆括号内的参数是形参列表,就算没有接收任何参数,也必须保留一对空的圆括号。
函数体中可以使用return语句返回值。return语句可以有多条,可以出现在函数体的任何位置。
调用函数的语法格式:
函数名([实参列表])
简单举例:
- def maxnum(a,b):
- if a>=b:
- return a
- else:
- return b
- print(maxnum(78,32))
1、默认值参数
调用函数时,如果没有传入对应的实参值,则函数使用声明时指定的默认参数值。
- def babble(words,time=1):
- print((words+" ")*time)
- babble('hello',3)
- babble('world')
注意:默认值参数必须写在形参列表的右边,这是因为函数调用时,默认是按位置传递实际参数值的。
2、名称传递参数
函数调用时,实参默认按照位置顺序传递参数,按照位置传递的参数称为位置参数。函数调用时,也可以通过名称(关键字)指定传入的参数,按照名称指定传入的参数称为名称参数,也称关键字参数。
- def mysum(mid_score,end_score,rate = 0.4):
- score = mid_score * rate + end_score * (1-rate)
- return score
-
- print(mysum(88,93))
- print(mysum(mid_score = 88,end_score = 93,rate = 0.5))
- print(mysum(rate = 0.5,end_score = 93,mid_score = 88))
3、可变参数
在定义函数的时候,使用带星号的参数,如*param1,则意味着允许向函数传递可变数量的参数。调用函数时,从该参数之后所有的参数都被收集为一个元组。
- def mingdan(*a):
- for i in a:
- print("{:^4}".format(i),end='')
- return len(a)
-
- count = mingdan('张三','李四')
- print("共{}人".format(count))
- count = mingdan('张三','李四','小阿丁')
- print('共{}人'.format(count))
在定义函数的时候,使用带有两个星号的参数,如**param2,则可以允许向函数传递可变数量的参数。调用函数时,从该参数之后所有的参数都被收集为一个字典。
- def countsum(**a):
- sum = 0
- print(a)
- for key in a:
- sum += a[key]
- return sum
-
- print(countsum(a1 = 10,a2 = 20,a3 = 30))
- print(countsum(male = 5,female = 7))
在函数体中使用return语句,可以从函数执行过程中跳出并返回一个值。如果需要返回多个值,则可以返回一个元组。
简单举例:
编写一个函数,返回两个整数本身,以及他们的商和余数。
- def jisuan(a,b):
- if b == 0:
- print("非法输入")
- else:
- return (a,b,a//b,a%b)
- n1 = int(input())
- n2 = int(input())
- n1,n2,n3,n4 = jisuan(n1,n2)
- print("两个整数是:{},{}".format(n1,n2))
- print("他们的商是:",n3)
- print("他们的余数是:",n4)
lambda()函数是一种简便的,在同一行定义函数的方法。lambda()函数实际上是生成一个函数对象,即匿名函数,它广泛应用需要函数对象作为参数或函数比较简单并且只使用一次的场合。
函数定义语法格式:
lambda 参数1,参数2,参数3,…… : <函数语句>
其中函数语句的结果为函数的返回值,且只能是一条语句。
简单举例1:
- f = lambda x,y:x*y
- print(f(12,2))
简单举例2:利用Lambda()函数输出列表中所有的负数。
- f = lambda x:x<0
- list =[3,5,-7,4,-1,0,-9]
- for i in filter(f,list): #filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
- print(i)
filter()函数接受两个参数,第一个为函数,第二个为序列。序列的每个元素作为参数传递给函数进行判断,然后返回True或False,最后将返回True的元素存放到新列表中。
如果对lambda函数不是很理解,也可以用一般的函数来解决:
- def f(x):
- return x<0
-
- list =[3,5,-7,4,-1,0,-9]
- for i in filter(f,list): #filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
- print(i)
对比可以发现,lambda()函数省去了使用def定义函数的步骤,十分简洁方便。
简单举例3:利用lambda()函数对字典元素按值或按键排序。
- dict_data = {'化1704':33,'化1702':28,'化1701':34,'化1703':30}
- print(sorted(dict_data))
- print(sorted(dict_data.items()))
- print(sorted(dict_data.items(),key=lambda x:x[1])) #按值排序,输出键值对
- print(sorted(dict_data.items(),key=lambda x:x[1]%10)) #按值的个位排序。输出键值对
每个变量都有自己的作用域,变量的作用域决定了在某些代码段内使用该变量是合法的,在某些代码段内使用该变量是非法的。两种最基本的变量作用域是“局部变量”和“全局变量”。
5.1 局部变量
- def f():
- x = 10
- return x*x
-
- print(f())
- print(x)
该例子中的变量x 是局部变量,它的作用域在函数f()的内部。
5.2 全局变量
- def f():
- x = 10
- return x*x
-
- x = 1000
- print(f())
- print(x)
该例子中的x是全局变量,它的作用域是整个代码段。
5.3 全局变量和局部变量同名
- def f():
- x = 5
- print(x)
- return x*x
-
- x = 10
- print(f())
- print(x)
该例子中的两个x虽然四同一个名字,但是两个的作用域却不一样,一个是局部变量,一个是全局变量。当执行函数里的print()语句的时候,既能访问函数里的局部变量x,也能访问全局变量x,这时,一个规定就是:在局部变量和全局变量同名的时候,局部变量屏蔽全局变量,简称“局部优先”。
如果一定要在函数中访问全局变量的话,使用关键字global声明将使用全局变量即可。
- def f():
- global x
- x = 5
- print(x)
- return x*x
-
- x = 10
- print(f())
- print(x)
import <模块> [as <别名>]
引用方法:<模块>.<名称>
from <模块> import <函数>
调用时,不需要再加上命名空间