函数
函数即变量,在python里函数就是一个变量,函数名就是一个变量名,这个函数名存的是这个函数的内存地址,它把函数体放到内存里,在调用的时候从函数名里保存的内存地址找到函数体然后运行这个函数。
如果只写函数名,打印一下,就是这个函数的内存地址。
例如:函数test(),print(test), 将打印类似:<function main at 0x10411cbf8>
1、自定义函数
1.1 定义方法:
def fun(): #函数名
print('hello') #函数体
1.2 函数的参数
形参:形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。
实参:实参可以是常量、变量、表达式、函数等,无论实参是何种类型,在进行函数调用时,他们都必须有确定的值传给形参。
例如:
def calc(x,y) # 定义一个函数,参数有x,y,x和y 为形参
print(x*y)
calc(3,5) # 调用上面定义的函数,3,5就是实参
1.3 形参类型
1)位置参数
按照参数的位置来进行传参,位置参数是必传的。例如上面的 calc函数的x,y。
有几个位置参数在调用时就要传几个,否则就会报错。
如果有多个位置参数,记不住哪个位置传哪个,可以使用位置参数的名字来指定。
例如:calc(x=2,y=5) 这样叫 关键字传参
2)默认参数
默认参数就是在定义形参的时候,给函数默认赋一个值,这样即使在调用时没有传入这个参数,也不会报错,且该参数有值
如果给默认参数传值的话,就使用传入的值;
如果使用默认值参数的话,必须放在位置参数的后面。
def conn_mysql(user,passwd,port=3306)
print()
conn_mysql('root','123456') #可以不传默认参数
conn_mysql('root','123456',port=3307) #指定默认参数的值
3)非固定参数
- 可变参数
可变参数用 * 来接收,后面想穿多少个参数传多少个。如果位置参数、默认值参数,可变参数一起使用的话,可变参数必须在位置参数和默认值参数的后面的。可变参数是非必传的。
def more_arg(name,age,sex='male',*args) #args是随便写的,但一般这样写
print()
more_arg('liu',20,'female','python','china')
- 关键字参数
关键字参数使用** 来接收。关键字参数在所有类型参数的最后面
使用关键字参数的话,调用的时候必须使用关键字传参。
def kw_args(name,**args)
print()
kw_args('liu',sex='female',age='19') #调用时,sex 和age 就是关键字调用
1.4 函数的返回值
每个函数都有返回值,如果没有在函数里面指定返回值的话,在python里面函数执行完之后,默认会返回一个None。
函数也可以有多个返回值,如果有多个返回值,会把返回值放到一个元组中。
函数中的返回值使用return,函数在遇到return 就立即结束。
函数返回多个值:
1、返回多个值,接收参数只有一个,则为一个元组
2、返回多个值,可以使用多个参数来接收
1.5 局部变量和全局变量。
局部变量:在定义的变量的函数内生效,其他地方失效。
全局变量:整个程序里都生效的。在程序最前面定义的都是全局变量。
全局变量要在函数中修改的话,需要加global关键字声明。如果是 list、字典和集合的话,则不需要加global关键字,直接可以修改。
name = 'liuy' #字符串全局变量
names = [] #list全局变量
def test():
global name #修改name的值需要用 global 关键字
name = ‘lily’
name.append(name) #修改全局变量names 的值
return names
test()
1.6 递归调用
函数内部调用自身,就是递归调用
递归调用的特性:
1)必须有一个明确的结束条件
2)每次进入更深一层递归是,问题规模相比上次递归应有所减少
3)递归效率不高,递归层次过多会导致栈溢出
2、内置函数
python自带的函数,不用安装就可以使用
len() type() id() max() dir() sorted() open() round(1,11) range(1,18)#产生一个list
3、匿名函数
print(filter(lambda x:x>5,[12,3,12,2,1,2,35]))#把后面的迭代对象根据前面的方法筛选
print(map(lambda x:x>5,[1,2,3,4,5,6]))
FAQ:
1、json文件格式错误时,会提示如下的错误