一,初始函数
1,什么是函数:函数就是 对代码块和功能的封装和定义.(就是对一种功能的封装)
函数的定义, 函数名, 函数体以及函数的调⽤
def 函数名(): # 在定义的时需要的参数,类似于占位符 函数体 #调用 函数名() # 在调用时需要传入的参数是实参 #这里的函数名的命名规则和使⽤和变量量基本一样.⾃⼰己回顾⼀下变量的命名规则. 函数体: 就是函数被执行之后要执行的代码
2,return的用法和作用:
2.1,函数中遇到return,此函数结束,不再继续执行
def yue(): print("回家") print("吃饭") print("约小姐姐") return print("约起看电影") # 这句话不会被执⾏ yue() # 这里的执行结果没有'约谁啊'
2.2, 给函数的调用者一个访问结果
def yue(): print("回家") print("早点回家") print("约小姐姐") return "等我" #直接给函数一个返回值 a = yue() print(a) # 等我 def fun(): print('没有') # return 5 print(fun()) # 没有 None 当没有return时,函数的值永远时None print(fun) #只要定义了一个函数都会生成一个地址,就像门牌号 <function fun at 0x00000158B8FD2E18>
2.3,函数的返回值可以有多个结果,且返回的结果是一个元组,我们可以通过解构的方式获取,如 return 4,5 ,可以通过 a,b = 函数名()
def yue(): print("回家") print("七夕了") print("约小姐姐") return "去游泳", "去吃火锅" girl = yue() # (去游泳 ,去吃火锅) print(type(girl)) # tuple
总结: 如果return什么都不写 或者 ⼲脆不写return .那么返回的就是None
如果return后⾯写了⼀个值. 则调⽤者可以接收一个结果 ,注意我们经常使用的print等常用的内置函数,也有retrun,如下
如果return后⾯写了多个结果, 则调用者可以接收一个tuple, 调用者可以直接解构成 多个变量
a = 3 c = print(a) print(c) # 结果是 3 None 这里print中也有return 只是后面没有跟值
三元运算:
形如:a if a > b else b 的运算形式的结构。 如果满足则a,否则b
注意这里三元运算还可以执行更多操作:
1.写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。 def leng(a): if a.startswith('[') and a.endswith(']'): a=a.strip('[]').split(',') # strip()可以成对切割 print('大于5') if len(a)>5 else print('小于或等于5') elif a.startwith('(') and a.endwith(')'): print('大于5') if len(a)>5 else print('小于5') else: print('大于5') if len(a)>5 else print('小于5') usr_input = input('请输入:').strip() leng(usr_input) 2、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。 def li(a): return a[:2] if len(a)>2 else '长度小于2' a =[1,2,3] print(li(a))
二, 函数的参数:
1,参数, 函数在调⽤的时候指定具体的⼀个变量的值. 就是参数. 语法:
def 函数名(参数列列表): 函数 def my_len(l): # l 形式参数 形参 print(l) count = 0 for j in l: count += 1 return count a = 'fdsafdsafdsagfsadf' print(my_len(a)) # 实际参数 ,实参 print(my_len([1,2,3]))
2,1. : 1,形参: 写在函数声明的位置的变量叫形参. 形式上的一个完整. 表示这个函数需要xxx
2. 实参: 在函数调用的时候给函数传递的值. 叫实参, 实际执行的时候给函数传递的信息. 表⽰给函数 xxx
3. 传参: 给函数传递信息的时候将实际参数交给形式参数的过程被称为传参.
3.1: 按照实参的角度,可以把参数分为: 位置参数, 混合参数,关键字参数 分别如下:
#1,位置传参 (位置必须按照顺序一一对应) def func(a,b,c): print(a) print(b) print(c) # 位置参数必须给它传值否则会报错!!! func('fdsafdas',3,4) # 有点⼉儿麻烦, 我们在这里学⼀个三元运算符. def my_max(a, b): c = a if a > b else b # 当a>b成立返回a, 否则返回b return c my_max(5,21) #2,关键字参数 (可以没有顺序,但是必须是全部关键字加上一个值) def max_min(a,b): return a if a > b else b print(max_min(b = 300,a = 200)) 3.混合传参,就是包含关键字和位置参数的混合 (但是必须把关键字参数放在最后) def func1(a,b,c,d,e): print(a) print(b) print(c) print(d) print(e) func1(1,2,d=4,c=3,e=5) func1(1,4,d=2,c=3,e=5)
4,按照形式参数分类: 位置参数 , 默认参数 (还有动态形参)
#位置参数 def func(a,b,c): print(a) print(b) print(c) func('fdsafdas',3,4) #默认参数 def stu_info(name,sex = "male"): """打印学生信息函数,由于班中大部分学生都是男生, 所以设置默认参数sex的默认值为'male' """ print(name,sex) stu_info('alex') # 默认是男的 stu_info('eva','female') 注意,默认参数这里有一个坑,默认参数是个可变类型时: 这里有坑,注意当默认参数是一个可变数据类型,如list,字典时,它的内存地址不会随调用轻易的改动,具体请看第二个例子 ef defult_param(a,l = []): l.append(a) print(l) defult_param('alex') defult_param('egon') #结果['alex'] ['alex', 'egon']
请问一下的代码的运行结果分别是:______、______、_______ [10,'a']、[123]、[10,'a']
def extendList(val,list=[]):
list.append(val)
return list
list1 = extendList(10)
#print(list)
list2 = extendList(123,[])
print(list)
list3 = extendList('a',)
print('list1=%s'%list1)
print('list2=%s'%list2)
print('list3=%s'%list3)
5,动态参数: 按位置传值多余的参数都由args统一接收,保存成一个元组的形式
def trans_para(*args,**kwargs): #无敌形参 print(args,type(args)) print(kwargs,type(kwargs)) trans_para("jinxin",12,[1,2,3,4],[3,4,],(1,4,7),{"a":"123","c":456},country="china") 动态参数,也叫不定长传参,就是你需要传给函数的参数很多,不定个数,那这种情况下,你就用*args,**kwargs接收,args是元祖形式,接收除去键值对以外的所有参数,kwargs接收的只是键值对的参数,并保存在字典中。 在函数里我们把args和kwargs分别进行调用就可以得到想要的值了
练习题:
1、.写函数,计算传入函数的字符串中,[数字]、[字母]、[空格] 以及 [其他]的个数,并返回结果。 def count_str(li): a,b,s,z = 0,0,0,0 for i in li: if i.isdigit():a += 1 elif i.isalpha(): b +=1 elif i ==' ': s += 1 else : z +=1 return '数字%s个,字母%s个,空格%s个,其他字符%s个'%(a,b,s,z) a =input('请输入:') print(count_str(a)) 2、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。 dic = {"k1": "v1v1", "k2": [11,22,33,44]} PS:字典中的value只能是字符串或列表 dic = {"k1": "v1v1", "k2": [11,22,33,44]} def check(dic): for i in dic: if len(dic[i]) >2: dic[i]=dic[i][:2] return dic print(check(dic)) 3.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作(升级题)。 def modifie(file_path,src,new): with open(file_path,'r',encoding='utf8') as f2, open('1.txt','w',encoding='utf8') as f: for i in f2: if src in i: i =i.replace(src,new) f.write(i) continue f.write(i) modifie('a1.txt','alex','sb')