Python函数和模块的定义与使用,包括变量的类型及匿名函数用法
函数的定义及作用
函数是组织好,可重复使用的,用来实现相关功能的代码段
函数提高了代码的重复利用率和应用的模块性。
除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版本之后的才能使用匿名函数lambda
不使用 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导入全部import module1[, module2[,... moduleN]# 导入模块 >>> import sys # 调用函数 >>> sys.path ["", "D:Anaconda3python37.zip", "D:Anaconda3DLLs", "D:Anaconda3lib", "D:Anaconda3", "D:Anaconda3libsite-packages", "D:Anaconda3libsite-packageswin32", "D:Anaconda3libsite-packageswin32lib", "D:Anaconda3libsite-packagesPythonwin"] # as 进行重命名 >>>import pandas as pdfrom … import
从模块中导入一个指定的部分from modname import name1[, name2[, ... nameN]]from … import *
把一个模块的所有内容全都导入from modname import *