函数是组织好,可重复使用的,用来实现相关功能的代码段
函数提高了代码的重复利用率和应用的模块性。
除Python自带的函数之外,也可以自己创建函数,叫做自定义函数
语法:
def 函数名(参数): 函数体
函数代码块以def开头
参数为输入值,放于函数名后口号里面,
函数内容以冒号:开始,函数体缩进,return返回输出值
def add(x,y):
z=x+y
return z
print(add(1,2))
参数
必须参数
参数需以正确的顺序传入函数,调用时的数量必须和声明时的一样
>>> def add(x,y): ... z=x+y ... return z ... >>> print(add(1)) Traceback (most recent call last): File "关键字参数", line 1, in TypeError: add() missing 1 required positional argument: 'y'
函数调用使用关键字参数来确定传入的参数值,此时,如果多个函数则不需要按照指定顺序。
>>> def person(name,age,sex,interest):
... print(name+'是一个高中生,今年'+str(age)+'岁了,性别'+sex+',喜欢'+interest)
...
# 或者使用return,是一样的效果
>>> def person(name,sex,interest,age = 16):
return name+'是一个高中生,今年'+str(age)+'岁了,性别'+sex+',喜欢'+interest
# 按照参数顺序,可以不指明参数名
>>> person('小明',18,'男','读书')
小明是一个高中生,今年18岁了,性别男,喜欢读书
# 如果不按照顺序,输出的内容则有可能出错
>>> person('男',18,'读书','小明')
男是一个高中生,今年18岁了,性别读书,喜欢小明
# 指定参数名,则不需要按照对应顺序
>>> person(sex='男',age=18,interest='读书',name='小明')
小明是一个高中生,今年18岁了,性别男,喜欢读书
默认参数
在定义函数时,指定参数默认值。调用时如果不传入参数,则使用默认值
>>> def person(name,age=16,sex,interest): ... print(name+'是一个高中生,今年'+str(age)+'岁了,性别'+sex+',喜欢'+interest) ... File "不定长参数", line 1 SyntaxError: non-default argument follows default argument # 以上错误,调整默认参数位置至所有参数最后就可以解决 >>> def person(name,sex,interest,age = 16): ... print(name+'是一个高中生,今年'+str(age)+'岁了,性别'+sex+',喜欢'+interest) ... >>> person(sex='男',age=18,interest='读书',name='小明') 小明是一个高中生,今年18岁了,性别男,喜欢读书 >>> person(sex='男',interest='读书',name='小明') 小明是一个高中生,今年16岁了,性别男,喜欢读书
一个星号*:用于存放声明时未命名的参数,这些参数叫做不定长参数。函数调用时没有参数传入的个数限制,这些函数声明时是未命名的参数会以元组形式导入
>>> def person(name,*canshu):
... print(name)
... print(canshu)
...
>>> person('小明','男','读书')
小明
('男', '读书')
不定长部分如果没有指定参数,传入是一个空元组
>>> person('小明')
小明
()
加了两个星号**的参数会以字典的形式导入
>>> def person(name,**canshu):
... print(name)
... print(canshu)
...
# 调用时必须指明参数名称
>>> person('小明','男','读书')
Traceback (most recent call last):
File "", line 1, in
TypeError: person() takes 1 positional argument but 3 were given
>>> person('小明',sex='男',interest='读书')
小明
{'sex': '男', 'interest': '读书'}
声明函数时,星号*可以单独出现,* 后的参数必须用关键字传入
>>> def f(a,b,*,c): ... return a+b+c ... >>> f(1,2,3) Traceback (most recent call last): File "强制位置参数", line 1, in TypeError: f() takes 2 positional arguments but 3 were given >>> f(1,2,c=3) 6
/ 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。
3.8版本之后的才能使用
不使用def定义函数,没有函数名
lamdba主体时一个表达式,而不是代码块,函数体比def简单很多
语法:
lambda [arg1 [,arg2,.....argn]]:expression
示例:
>>> lambda1=lambda name,age,sex,interest:name+'是一个高中生,今年'+str(age)+'岁了,性别'+sex+',喜欢'+interest
>>> lambda1('小明',18,'男','读书')
'小明是一个高中生,今年18岁了,性别男,喜欢读书'
>>> lambda1(name='小明',sex='男',interest='读书',age=18)
'小明是一个高中生,今年18岁了,性别男,喜欢读书'
变量作用域
定义在函数内部的为局部变量,仅能在函数内部使用
定义在函数外部的为全局变量,可在全局使用
>>> a=5 >>> def test(b,c): ... return a,b,c ... >>> test(6,7) (5, 6, 7) >>> b Traceback (most recent call last): File "模块", line 1, in NameError: name 'b' is not defined >>> a 5
模块是将包含所有定义的函数和变量的文件,一般将同类功能的函数组和在一起称为模块。
模块需要导入后,在调用相应函数进行使用
模块导入的方法:
import module1[, module2[,... moduleN]
# 导入模块 >>> import sys # 调用函数 >>> sys.path ['', 'D:\Anaconda3\python37.zip', 'D:\Anaconda3\DLLs', 'D:\Anaconda3\lib', 'D:\Anaconda3', 'D:\Anaconda3\lib\site-packages', 'D:\Anaconda3\lib\site-packages\win32', 'D:\Anaconda3\lib\site-packages\win32\lib', 'D:\Anaconda3\lib\site-packages\Pythonwin'] # as 进行重命名 >>>import pandas as pdfrom … import
从模块中导入一个指定的部分
from modname import name1[, name2[, ... nameN]]from … import *
把一个模块的所有内容全都导入
from modname import *



