python函数(二) 最后更新时间:2021年01月06日 ##### 函数的返回值 当两个函数之间,想要互相使用到内部变量时,就可以应用到函数的返回值。 + 使用 return 关键字返回内容 + 将内容 返回到 函数调用处 + 函数体中没有 return 语句时,函数运行结束,则默认返回 None,也被称为隐含返回值。 示例: ```python def sao(name): return name print(sao("kirito")) # ==>kirito ``` ##### 函数多个返回值 - 当执行函数体内代码时,遇到第一个 return 就将指定值返回到函数调用处,也就是执行到return这行代码,后面的都不执行了。 - 多个返回值时,用逗号隔开,但默认为元组。 示例: ```python def sao(name,age,skill): return name,age,skill print(sao("kirito",16,"星爆气流斩")) # ==>('kirito', 16, '星爆气流斩') ``` 如果要逐个输出,拆包就行。 示例: ```python def sao(name,age,skill): return name,age,skill print("姓名:{},年龄:{},技能:{}".format(*sao("kirito",16,"星爆气流斩"))) # ==>姓名:kirito,年龄:16,技能:星爆气流斩 ``` ##### 函数作用域 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。 变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python 的作用域一共有4种,分别是: - L(local):局部作用域,即函数中定义的变量; - E(enclosing):嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的; - G(global):全局变量,就是模块级别定义的变量; - B(build-in):内建作用域,系统固定模块里面的变量,比如:int()等; ###### global关键字 当我们需要在函数内部直接修改全局变量时,我们可以将函数内部的局部变量通过 global 关键字声明为全局变量。 ###### 函数作用域的优先级 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210106190131844.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjIxMTM1Mg==,size_16,color_FFFFFF,t_70) ##### 递归函数 函数Func(args)直接或间接调用函数本身,则该函数称为递归函数。 示例: ```python def test(num): if num > 1: return num*test(num-1) else: return 1 print(test(4)) # ==>24 ``` ###### 注意 - 递归函数自身没有结束条件,所以需要我们自己设置结束条件,终止函数的调用。 - 可以使用递归实现的循环都可以实现,并且递归效率很低,所以递归很少使用。 ##### 内置文件中常用方法: 1. range(start, stop, step): 分别表示开始值,结束值(但不包括stop),步长。 示例: ```pyhton for a in range(1,10,2): print(a) # ==>1 # ==>3 # ==>5 # ==>7 # ==>9 ``` 2. zip() zip()用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。 示例: ```python a=["name","age","skill"] sao=["kirito", 16, "星爆气流斩"] for b in zip(a, sao): print(b) ``` 内置文件中常用方法: `map(func,*iterables)` --> map object map() 会根据提供的函数对指定序列做映射。 `filter(func, iterable)` --> filter object filter() 用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。 其中: + func为函数 + iterable为可迭代对象 ##### 匿名函数 当我们在传入函数时,有些时候,不需要重复调用该函数,直接传入匿名函数更方便,也无需担心函数名冲突,并且还可以将匿名函数赋值给一个变量,再利用变量来调用该函数。 语法:`lambda x:x*z` 其中: + lambda表示匿名函数的关键字。 + x为参数。 + x*z为返回值。 ##### 问题: ###### 问题一: 1.定义一个函数完成用户输入的三个数字的求和以及在另一个函数求该和的平均值(用到函数传参,函数返回值)。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210106223712275.png) 回答: ```python def sums(x,y,z): return x+y+z def ave(sum): return sum/3 if __name__ == "__main__": print(sums(1,2,3)) # ==>6 print(ave(sums(1,2,3))) # ==>2.0 ``` ###### 问题二: 将列表l输出。l = ["jack",("tom",23),"rose",(14,55,67)] 提示:用递归实现。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210106223652908.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjIxMTM1Mg==,size_16,color_FFFFFF,t_70) 回答: 写法1: ```python def p(i): for n in i: if type(n) == type(tuple()): p(n) else: print(n) i = ["jack",("tom",23),"rose",(14,55,67)] p(i) # ==>jack # ==>tom # ==>23 # ==>rose # ==>14 # ==>55 # ==>67 ``` 写法2: ```python def p(i): for n in i: if isinstance(n,tuple()): p(n) else: print(n) i = ["jack",("tom",23),"rose",(14,55,67)] p(i) ``` 写法3: ```python def p(i): for n in i: if isinstance(n,(int,str)): print(n) else: p(n) i = ["jack",("tom",23),"rose",(14,55,67)] p(i) ``` ###### 问题三: infors = [{'name':'qian','age':28},{'name':'amy','age':20},{'name':'james','age':25}] 以name对应的值进行排序。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210106223630972.png) 回答: ```python infors = [{'name':'qian','age':28},{'name':'amy','age':20},{'name':'james','age':25}] infors.sort(key=lambda x:x["name"]) print(infors) # ==>[{'name': 'amy', 'age': 20}, {'name': 'james', 'age': 25}, {'name': 'qian', 'age': 28}] ```
Comments | NOTHING