函数相关
一:三元计算(三目计算)
if 条件语句的简写 v= 前面 if 条件 else 后面 #条件成立得到前面的值,否则得到后面的值
二:函数的基本认识
1.函数式编程:
- 本质:将n行代码拿到别处并给他起个别名,以后通过名字就可以找到这行代码并执行
- 场景:1.代码重复执行 2.代码量特别多超过一屏,可以通过函数进行代码的分割
2.函数的基本结构
#函数的定义 def 函数名(参数): 函数体 函数名() #执行函数
#函数如果不被调用,则内部代码永远不会执行
3.函数参数:
定义一个函数:给了函数一个名称,指定了函数里包含的参数和代码块结构
这个函数的基本结构完成以后,可以通过另一个函数调用执行,也可以直接从python命令提示符执行
示例:打印某个列表的元素 def get_list_first_data(aaa): # aaa叫形式参数(形参) v = [11,22,33,44] print(v[aaa]) get_list_first_data(1) # 调用函数时传递叫:实际参数(实参)
4.返回值(return)
1.函数没有返回值时,默认返回none
2.函数执行过程中遇到return时,则终止,下面代码永远不会执行
3.可以返回任意类型
#特殊: def func(): return 1,2,3 result = func() print(result) #返回的元组 (1,2,3)
综合示例: # 让用户输入一段字符串,计算字符串中有多少a字符的个数。有多少个就在文件a.txt中写多少个“嘻嘻嘻”。 def get_char_count(data): sum_counter = 0 for i in data: if i == 'a': sum_counter += 1 return sum_counter def write_file(line): if len(line) == 0: return false # 函数执行过程中,一旦遇到return,则停止函数的执行。 with open('a.txt',mode='w',encoding='utf-8') as f: f.write(line) return true content = input('请输入:') counter = get_char_count(content) write_data = "嘻嘻嘻" * counter status = write_file(write_data) if status: print('写入成功') else: print('写入失败')
三:参数相关
1.位置参数:(调用函数并传入函数)
2.关键字参数:
def func(num1,num2) print(num1,num2) func(num1=1,num2=2) #赋值为关键字参数
************注意: 位置参数可以和关键字参数混合使用,但位置参数一定要在关键字参数前面***********
3.默认参数(默认参数推荐使用不可变类型,慎用可变类型)
def func(a1,a2,a3=1,a4=2) #a3,a4为默认参数 print(a1,a2,a3,a4) func(11,22) #a3和a4 已有默认参数,所以不必再定义参数 func(11,22,a3=10,a4=100) #再次定义参数,覆盖前面的参数
******当默认参数为可变类型时 (有坑)*******
#注意一 def func(a,b=[]): b.append(a) return b v1 = func(1) v2 = func(2,[11,22]) v3 = func(3) print(v1,v2,v3) #[1,3] [11,22,3] [1,3] #注意二: def func(a,b=[]): b.append(a) print(b) func(1) #[1] func(2,[11,22]) #[11,22,2] func(3) #[1,3]
4.万能参数(打散)
- *args:可以接收任意个数的位置参数,并将其转换成元组
- 调用函数无*
def func(*args): print(args) func(1,2,3) #打印func后内容,里面可以是列表集合等
- 调用函数有*
def func(*args): print(args) func(*(1,2,3,4)) # 不管里面的内容是列表/集合都打印成元组,当里面内容为字典时,打印内容为字典的key(键)
- **kwargs :可以接收任意个数的关键字参数,并将其转换成字典
- 调用函数无**
def func(**kwages): print(kwages) func(k1=1,k2=2) #{'k1': 1, 'k2': 2}
- 调用函数有**
def func(**kwages): print(kwages) func(**{'k1':1,'k2':2}) #后面内容只能是字典
四:作用域&函数嵌套
1.python中
- py文件:全局作用域
- 函数 : 局部作用域 , 一个函数就是一个作用域
- 作用域查找规则:优先在自己的作用域查找数据,自己没有就去上一级查找,然后上上级,直到全局,全局没有就报错
#示例1: x = 10 def func(): x = 8 print(x) # 8 def x1(): print(x) # 9 x = 9 x1() x = 10 print(x) # 10 func() #示例2: x = 10 def func(): x = 8 print(x) # 8 def x1(): print(x) # 8 x1() x = 9 x1() # 9 x = 10 print(x) # 10 func()
2.子作用域中只能找到父级中的值,默认无法重新为父级中的变量进行赋值..(global和nonlocal可以强制做)
- global :找到并改变全局中的变量
name = "老男孩" def func(): name = 'alex' def inner(): global name name = 999 inner() print(name) # 'alex' func() print(name) # 999
- nonlocal : 找到并改变上一级中的变量
name = "老男孩" def func(): name = 'alex' def inner(): nonlocal name name = 999 inner() print(name) # 999 func() print(name) # "老男孩"
*****要求:全局变量以后必须大写*****
五:函数的其他应用
1.函数名当做变量来使用
#注意:不带括号指向的是内存地址,带括号是调用函数 def func(): return 123 func_list1 = [func,func,func] func_list2 = [func(),func(),func()] print(func_list1) # 打印的是内存地址 print(func_list2) #打印的是 : [123,123,123] 调用函数 info = { 'k1':func, #内存地址 'k2':func(), # 调用函数 } print(info)
2.函数可以当做参数进行传递
结果 : 666 none none
3.函数可以作为返回值
结果是 : 0 1 4
4.闭包
概念:为函数创建一块区域并为其维护自己的数据,以后执行时方便调用
5.递归 : 函数自己调自己
#递归打印斐波那契数 def func(a,b): # 1 # 1 # 2 # 3 # 5 print(b) #[0,1,1,2,3,5,8,11...] func(b,a+b) func(0,1)
六:lambda 表达式(也叫匿名函数)
用于表示简单的函数
***注意:列表所有方法的返回值基本都为none ,字符串所有方法的返回值基本都会返回新值***