5.函数

2019-06-22  本文已影响0人  辉神来了

定义函数

image.png
image.png
函数参数--必备参数

函数定义中允许拥有多个参数,因此函数在调用的时候,也可能包含多个实参,向函数传递参数的方式有很多,通过实参和形参的顺序对应,这就是位置实参,只有位置一致,才能被正确匹配。位置实参是最简单也是最常用的关联方式


image.png
函数参数--关键字参数

关键字实参是传递给函数名称-值对。 直接在实参中将名称和值关联起来,因此向后函数传递实参时不会混淆,函数调用使用关键字参数来确定传入的值,使用关键字参数允许调用时参数的顺序与声明时不一致,因为Pythin解释器能够用参数名匹配参数值


image.png
函数参数-- 参数默认值

函数定义的时候,设置的参数是形参,那么也可以给每个形参指定一个默认值。当调用函数时,如果没有传入实参,就使用形参的默认值,如果调用的时候传入了实参,那么程序将使用传入的实参


image.png
函数参数-- 不定长参数

一个函数能处理比当初声明更多的参数,这些参数叫做不定长参数


image.png
image.png
函数参数--可变对象与不可变对象

不可变类型:如 整数、字符串、元祖。如fun(a),传递的只是a的值,没有影响a对象本身, 比如在fun(a)内部修改a的值,只是修改另一个复制的对象,不会影响a本身。
可变类型: 如列表,字典,如fun(la),则是将la真正的传过去,修改后fun外部的la也会受影响

函数返回值

什么是返回值
 函数并非总是将结果直接输出,相反,函数额调用者需要函数提供一些通过函数处理过后的一个或者一组数据,只是调用者拥有了这个数据,才能做一些其他的操作,那么这个时候,就需要函数返回给调用者数据,这个就被称为返回值,想要在函数中把结果返回给调用者,需要在函数中使用return
return 语句

return 语句用于退出函数,选择性的向调用者返回一个表达式,直接return的语句返回 None

接受返回值

我们可以将函数的返回值保存在变量中


image.png
函数类型
什么是yield呢?

yield的作用就是把一个函数变成一个generator,带有yield的函数不再是一个普通函数,Python解释器会将其视为一个生产器,如调用Xum函数,不会执行该函数,而是返回一个iterable迭代对象!
区别:与returne类型,都可以返回值,但不一样的地方,yield可以返多次,而 return只能返回一次

迭代器

迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式,
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开发访问,直到所有元素被访问完结束。
迭代器智能往前不会后退。迭代器有两个基本的方法,iter()和next(). 字符串,列表或元祖,集合对象都可用于创建迭代器:

  list  = [1, 2, 3, 4]
  it = iter(list)
 print(next(it))
 输出:1
print(next(it))
输出:2

生成器 (generator)

使用了yield的函数被称为生成器。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器
在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值并在下一次从当前位置继续运行
注意:可以通过for循环或者手动调用Xun(5)的next()方法


image.png
生成器-send

a = yield 1 这个表达式,如果这个表达式只是x=1,相信每个人都能理解是把1的值赋值给了x,而现在等号右边是一个yield1,所以先要执行yield1,然后才是赋值 ,yield把1值返回到了调用者哪里,因为执行等号右边的 yield就是暂停 ,所以不会对a赋值,而这个表达式的下一步操作,赋值缺换句话说a = yield 1只执行了一半,而send()里面的值得作用是把值传进当前的yield中

变量的作用域

一个程序的所有的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的
变量的作用域决定了在那一部分程序你可以访问哪个特定的变量名称,两种最基本的变量作用域如下:

可变类型的全局变量
局部变量

什么是局部变量


image.png
全局变量
修改全局变量
匿名函数

\color{red}{匿名函数}定义函数的过程中,没有给定的名称就叫做匿名函数,Python中使用lambda表达式来创建匿名函数
lambda 来创建匿名函数规制:
- lambda 只是一个表达式,函数体比def 简单很多
-lambda 的主体是一个表达式,而不是一个代码块,所以不能写太多的逻辑进去
-lambda 函数拥有自己的命名空间,且不能访问自由参数列表之外或全局命名空间里的参数。
-lambda 定义的函数的返回值就是表达式的返回值,不需要return 语句块
-lambda 表达式的主要应用场景就是赋值给变量、作为参数传入其它函数

'''
    匿名函数
    lambda def [参数](): 表达式 return xx
    默认会返回一个表达式
'''
#没有参数的lambda表达式
# s = lambda : '哈哈啊哈'   #通过;lambda 声明一个匿名函数 并且 赋值给 s
# print(s())   #通过s调用匿名函数

#声明一个参数
# s = lambda x: x*2
# print(s(3))

# s = lambda x,y: x+y
# print(s(3,4))

'''
    矢量化的三元运算符
    if  条件:
        代码块哦
    else:
        代码块
        
    条件成立的内容   if 条件 else 条件不成立的内容
'''
s = lambda x,y: x if x > 2 else y
print(s(1,4))
递归函数
内置函数与高阶函数
 list01 = [1,3,5,7,9]

#map
 nlist02 = [2,4,6,8,10]
new_list = map(lambda x,y:x*y,list01,list02)
print(list(new_list)) #将map对象转换为list
 for i in new_list:
    print(i)

#filter
 list02 = [2,4,6,8,10]
 new_list = filter(lambda x:x>4,list02)
 print(list(new_list))

# for i in new_list:
     print(i)

#reduce
from functools import reduce
 list02 = [2,4,6,8,10]
 new_list = reduce(lambda x,y:x+y,list02,0)
 print(new_list)
上一篇 下一篇

猜你喜欢

热点阅读