函数与过程
一般我们认为函数(function )是有返回值的,但过程(procedure)是简单的、特殊的、没有返回值的。
在Python一般来说是只有函数没有过程的:
>>> def hello():
print('hello ixaoyi')
>>> temp = hello()
hello ixaoyi
>>> print(temp)
None
>>> temp
在Python是有返回值的
Python中是编译器动态的分配变量的类型,Python的返回值是可以有多个的:
>>> def back():
return [1,'xiaoyi',2]
>>> back()
[1, 'xiaoyi', 2]
>>>
变量的作用域
局部变量,全局变量
def dis(price,rate):
final_price = price*rate
return final_price
old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = dis(old_price,rate)
print('打折后的价格:',new_price)
函数中的变量一般是局部变量,函数执行完之后,局部变量就会被清空,全局变量的范围是整个模块。
如果函数试图修改全局变量,那么函数的内部会自动创建一个局部变量来代替全局变量,全局变量的本身的值是不变的 。所以最好不要在函数中修改全局变量,可以访问。
当然如果非要在函数中修改全局变量也是可以的,那就要用global关键字了:
>>> a = 5
>>> def count():
global a
a = 10
print(a)
>>> count()
10
>>> a
10
>>>
内嵌函数和闭包
内嵌函数就是在函数中在写一个函数
>>> def fun1():
print('fun1正在运行中。。。')
def fun2():
print('fun2正在运行中。。。')
fun2()
>>> fun1()
fun1正在运行中。。。
fun2正在运行中。。。
>>>
内嵌函数的作用域在外函数中,就是只在他自己的外部函数中
闭包
闭包:内部函数定义在外部函数中,外部函数的变量在内部函数中有使用。
简单来说闭包就是函数中的函数但是与内嵌不同的是,在使用闭包的时候外部函数不对内部函数调用
>>> def funx(x):
def funy(y):
return x*y
return funy
>>> a = funx(8)
>>> a(5)
40
>>> funx(8)(5)
40
>>>
一般情况下闭包中的内部函数是不能修改外部函数的参数的,如果想要修改那就只好用关键字nonlocal:
>>> def fun1():
a =5
def fun2():
nonlocal a
a *= a
return a
return fun2()
>>> fun1()
25
>>>
lambda可以定义匿名函数
>>> b = lambda x : x*2 +3
>>> b(6)
15
>>>
当然多个参数也是 可以实现的,只要用逗号隔开就可以了。
>>> b = lambda x,y : x*2 +y
>>> b(3,4)
10
>>>
lambda表达式的作用:
Python写一些执行脚本时,使用lambda就可以省下定义函数的过程
对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,有时候给函数起个名字也是比较头疼的问题,使用lambda不用考虑函数名的问题
简化代码的可读性,由于不同的函数阅读经常要调到开头def定义部分,使用lambda函数可以省去这样的步骤。
filter()过滤器函数,通过过滤器我们可以实现筛选
>>> filter(None,[1,0,False,True])
<filter object at 0x000001162393A630>
>>> list(filter(None,[1,0,False,True]))
[1, True]
>>>
>>> def odd(x):
return x%2
>>> temp = range(10)
>>> show = filter(odd,temp)
>>> list(show)
[1, 3, 5, 7, 9]
既然学过了lambda 就是用一下:
>>> list(filter(lambda x : x%2,temp))
[1, 3, 5, 7, 9]
>>>
我们可以很明显的看出来lambda函数非常简洁的
map()函数加工序列中的每一个可迭代元素
>>> list(map(lambda x : x*2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>>