python学习笔记12 python中的函数(上)
上一篇记录中我们学习了python中的文件操作
这一篇我们来介绍python中的函数
函数
函数的定义
#使用python中的关键字 def
def 函数名(…):
函数代码逻辑
函数使用特点
- 函数不调用不执行
- 定义函数必须在调用函数之前出现
函数的参数
-
参数的种类
-
形式参数:指的是函数定义时,小括号中定义的参数
-
实际参数:指的是将来调用函数时,实际传入进去的具体的值
def fun(a,b): #a b 是形式参数,名字自定义 print(a+b) a1=int(input("请输入第一个数值:")) b1=int(input("请输入第二个数值:")) fun(a1,b1)
-
-
参数的传值方式
-
位置传参
def show(a,b,c): print(f"a:{a},b:{b},c:{c}") show(1,2,3) #a:1,b:2,c:3
-
关键字传参【通过形参的名字传参】
def show(a,b,c): print(f"a:{a},b:{b},c:{c}") show(b=2,a=1,c=3) #a:1,b:2,c:3
-
混合传参
def show(a,b,c): print(f"a:{a},b:{b},c:{c}") show(1,c=3,b=2) #a:1,b:2,c:3
特别注意:混合传参的时候,前面没有关键字的实参是会按照形参的位置来的,后面关键字传参可以顺序不一样。
-
默认值传参
练习题:调用一个函数,传入一个大字符串和一个小字符串,查找小字符串在大字符串中出现的次数,调用函数的时候,可以不传小字串,默认查找字符’a’在大字符串中的出现次数。
def str_num(str1,str2): n=0 list1=list(str1) for i in list1: if i ==str2: n+=1 print(n) str1=input("请输入字符串") str2=input("请输入要查找的字母") str_num(str1,str2)
-
动态传参
未使用动态参数时,解决需求,比较麻烦,参数需要另外定义一个函数
def sum1(*num): # 这里的num 是一个元组,接收若干个将来调用时传入的实参 n = 0 for i in num: n = n + i print(f"总和为:{n}") sum1(10, 20) # 30 sum1(10, 20, 30) # 60 sum1(10, 20, 30, 40) # 100
特别注意:动态传参的内容,多个参数的类型可以是不一样的
- 一个动态参数
def sum1(*num): # 这里的num 是一个元组,接收若干个将来调用时传入的实参 print(num, type(num)) sum1(11) # (11,) <class 'tuple'> sum1(11, '小虎', [11, 22, 33]) # (11, '小虎', [11, 22, 33]) <class 'tuple'> sum1((11,22,33)) # ((11, 22, 33),) <class 'tuple'>
- 两个动态参数
def sum2(**num): print(num,type(num)) sum2(id='20240001',name='伊一',age=18,) #{'id': '20240001', 'name': '伊一', 'age': 18} <class 'dict'>
结论:
* :表示传入的每一个单独的元素都被封装成一个元组
** :表示传入的是一个一个的键值对,所有的键值对会被封装成一个字典我们今后开发的时候,定义动态参数时,起名字是固定的,
若一个*的动态参数,名字起为*args,若**的动态参数,名字起为**kwargs
-
函数的返回值
理论上,python中所有的函数都有返回值
python中提供了一个关键字return给我们在函数中使用,表示调用完后返回的值。
def sum1(a,b):
c=a+b
return c
res1=sum1(10,20)
print(res1) #30
print(res1+20) #50
-
函数返回值的特点
-
一个函数如果没有写return,默认情况下,这个函数最后一句话会有一个return None
-
return 和 print的区别?
- return 是调用完函数时,可以返回一个值给调用者
- print 就直接输出了,没有返回值
-
一个函数中,如果遇到了return,那么这个函数就结束了,函数中的后续代码不执行。
def sum1(a,b): c=a+b return c print("今天是自习日") #不执行 res1=sum1(10,20) print(res1) #30
-
一个函数中只能有一个return
def sum1(a,b): c=a+b return c print("今天是自习日") #不执行 return 0 #无效代码 res1=sum1(10,20) print(res1) #30
def fun1(): for i in range(1,11): return i res1=fun1() print(res1) #1 是1不是10! ! !因为for循环里第一次执行return就结束了
-
函数返回值return后面,要返回的类型可以是任意的类型
-
-
函数参数和返回值的练习
练习题:定义 两个函数,第一个函数用户循环输入要累加的数值,函数内部将用户输入的值封装成一个列表返回;第二个函数将第一个函数返回的列表当作参数传入,返回列表中所有数据之和的结果。
def n_list(*args): list1=[] while True: n = input("请输入:") if n.strip().upper() == 'Q': print("输入结束") break else: list1.append(int(n)) return list1 def sum_list(list): sum=0 for i in list: sum+=i return sum print('输入要累加的数值,按q或者Q结束输入') res1=n_list() print(res1,type(res1)) res2=sum_list(res1) print(res2,type(res2)) def get_list(): list1 = [] while True: n = int(input("请输入一个数值:")) if n == -1: break list1.append(n) return list1 def sum_list(l2): n = 0 for i in l2: n += i return n l1 = get_list() print(l1) res2 = sum_list(l1) print(res2)
-
函数返回值的一些进阶用法
-
直接返回多个值,多个值之间使用英文逗号分隔,实际返回的内容是一个元组
def show1(): return 11,22,33 res1=show1() print(res1,type(res1)) #(11, 22, 33) <class 'tuple'>
-
分别接收每个返回元素的值
def show1(): return 11,22,33 a1,a2,a3=show1() print(f"a1:{a1}") #a1:11 print(f"a2:{a2}") #a2:22 print(f"a3:{a3}") #a3:33
def show1(): return 11, ['hello','world','python'], 33 a1, a2, a3 = show1() print(f"a1:{a1}") # a1:11 print(f"a2:{a2}") # a2:['hello', 'world', 'python'] print(f"a3:{a3}") # a3:33
-
函数的分类
-
无参无返回值
def fun1() print('hhh')
-
无参有返回值
def fun2() return 0
-
有参无返回值
def sum1(a,b): print(a+b) sum1(10,20) #30
-
有参有返回值
def fun1(s1): return "伊一"+s1 res1=fun1('welcome') print(res1) #伊一welcome
函数可以进行嵌套
-
嵌套调用
def fun1(): print('hi,伊一') def fun2(): return 0 def fun3(a,b,c): fun1() res1=fun2() return a+b+c res2=fun3(1,2,3) print(res2) #hi,伊一 #6
-
嵌套定义
def fun1(): a=10 def fun2(): print("hi,伊一") print(a) fun2() fun1() #10 #伊一 fun2() #报错不执行
练习题:定义一个函数,传入一个文本路径,和一个关键词,将文本中包含关键词的那一句话拿出来放在一个列表中返回该列表
# @author:teacher import os def get_word_list(file_os, word): res_list = [] if os.path.exists(file_os): f = open(file_os, 'r', encoding='UTF-8') line_list = f.readlines() for line in line_list: if word in line: res_list.append(line.strip()) else: print("该路径不存在!!") return res_list list1 = get_word_list('text.txt', '水') print(list1)
函数的传值问题
-
不可变对象【str、int、float、bool】
def fun1(x, y): print(f"x:{x}, y:{y}") # x:hi, y:伊一 x = y x = x + x print(f"x:{x}, y:{y}") # x:伊一伊一, y:伊一 s1 = "hi" s2 = "伊一" print(f"s1:{s1}, s2:{s2}") # s1:hi, s2:伊一 fun1(s1,s2) print(f"s1:{s1}, s2:{s2}") # s1:hi, s2:伊一
-
可变对象【list、tuple、dict、set、类】
def fun1(x, y): print(f"x:{x}, y:{y}") # x:['hi'], y:['伊一'] x = y x.append('python') print(f"x:{x}, y:{y}") # x:['伊一', 'python'], y:['伊一', 'python'] s1 = ['hi'] s2 = ['伊一'] print(f"s1:{s1}, s2:{s2}") # s1:['hi'], s2:['伊一'] fun1(s1,s2) print(f"s1:{s1}, s2:{s2}") # s1:['hi'], s2:['伊一', 'python']
作用域和变量
在python中,作用域分为两个区域
函数外是一个作用域
函数内部是一个作用域
- 全局变量:将变量定义在函数外
- 局部变量:将变量定义在函数内部
全局变量和局部变量使用特点
局部作用域中可以使用到全局变量【可以使用函数外部定义的变量】
函数与函数内部的作用域是相互独立的,不能互相调用函数内部创建的局部变量
python中提供了一个关键字global ,在函数内部定义一个全局变量,出了函数也是可以被访问到的。
特别注意:如果函数内部有变量被global修饰,需要先调用该函数,让内存中出现这个变量,后续才能去使用。
def fun1():
global a
a = 100
fun1()
print(a) #100
进阶:函数名也可以当作一个变量使用
-
用法场景1:赋值
def fun1(): print("好好学习,天天向上!") fun2 = fun1 fun2() #好好学习,天天向上!
赋值的时候,注意有没有小括号,方法名直接赋值,相当于给函数另起了一个名字;如果加了小括号,相当于调用函数的结果赋值。
-
用法场景2:变量可以存储在容器中,比如列表
def fun1(): print("鹅鹅鹅") def fun2(): print("曲项向天歌") def fun3(): print("白毛浮绿水") def fun4(): print("红掌拨清波") fun_list = [fun1, fun2, fun3, fun4] flag = input("请输入开始:") for i in fun_list: i()
-
用法场景3:将函数作为返回值使用
def fun1(): print("鹅鹅鹅") def fun2(): print("曲项向天歌") def fun3(): print("白毛浮绿水") def fun4(): print("红掌拨清波") fun_list = [fun1, fun2, fun3, fun4] def show1(): for i in fun_list: i() def function1(): return show1 res1 = function1() res1()
-
用法场景4:
def fun1(): print("鹅鹅鹅") def fun2(): print("曲项向天歌") def fun3(): print("白毛浮绿水") def fun4(): print("红掌拨清波") fun_list = [fun1, fun2, fun3, fun4] def show1(): for i in fun_list: i() def function1(s): s() function1(show1)
下一篇我们来介绍一些python的内置函数和函数生成式。
点赞收藏关注,一起打卡python学习吧