函数的初识
def关键字 空格 函数名(命名要求与变量相同): 函数体 执行函数:函数名 () 函数是以功能为导向的。 def login(): pass def register(): pass
函数的返回值:
return: 1.函数中遇到renturn ,结束函数,下面的代码不执行。 2.将函数的值返回给函数的调用者(执行者) 第一种情况: 只有return,返回None 第二种情况; return None 第三种情况: return 单个值。返回值得类型与值的类型相同。 第四种情况: return 多个值,以元祖的形式返回给函数的调用者。
函数的参数。
# 实参角度 位置参数 一一对应,实参形参数量相等 关键字参数 一一对应,实参形参数量相等,实参顺序可变 混合参数 (位置参数,关键字参数) 关键字参数必须在位置参数后面 # 形参角度 位置参数 一一对应,实参形参数量相等 默认参数 默认参数必须放在形参的位置参数后面 默认参数不传值则为默认值,传值则覆盖默认值。 动态参数
什么是None?所有的空集合,字典,列表,字符串...'''
重复代码多,可读性差 函数的产生: 函数就是封装一个功能。
def my_len():# def 关键字 定义一个函数#my_len 函数名,书写规则和变量一样# def与函数名中间一个空格# 函数名(): 加上冒号# 函数体 l1 = (1, 2, 3, 4, 5, [3, 2, 1], 'alex', '小明', 'a', 'b') count=0 for j in l1: count+=1 print(count)my_len()函数执行:函数名+()
函数的返回值 写函数,不要在函数中写print() return
1.在函数中,遇到return结束函数2.将值返回给函数的调用者 无return return None return 一个值,该值是什么,直接返回给函数的调用者,函数名() return 多个值,将多个值放在一个元阻里,返回函数的调用者。
def my_len(): count=0 l1 = (1, 2, 3, 4, 5, [3, 2, 1], '小强', '小明', 'a', 'b') for j in l1: count+=1 return count# ret=my_len()# print(ret)print(my_len())print(len('15428517'))
def my_len(l): #l形式参数,形参 print(l) count=0 for i in l: count+=1 return counta='kfjimirmvirv'print(my_len(a)) #实际参数,实参print(my_len([1,2,3]))实参角度:1.位置传参,按顺序,一一对应。def func(a,b,c): print(a) print(b) print(c)func('alex',[1,2,3],666)
写一个函数,功能是比较大小
def mix_min(a,b): if a>b:return a else:return ba=int(input('请输入一个数:'))b=int(input('请输入另一个数:'))print(mix_min(a,b))
三元运算
def mix_min(a,b): # z=a if a>b else b # return z return a if a>b else ba=int(input('请输入一个数:'))b=int(input('请输入另一个数:'))print(mix_min(a,b)) def mix_min(a,b) return a if a>b else b
关键字传参,不按顺序,一一对应。
def mix_min(a,b): return a if a>b else bprint(mix_min(b=200,a=105))
混合传参,关键字传参永远在最后面
def func1(a,b,c,d,e): print(a) print(b) print(c) print(d) print(e)func1(1,2,d=8,c=6,e=9)func1(1,d=5,c=8,9,3) #报错
按照形参角度:
# 1.位置传参,按位置,一一对应def func(a,b,c): print(a) print(b) print(c)func('hh',666,'上善若水')# 2.默认参数:传参则覆盖,不传参则默认,默认参数永远在位置参数后面def func(a,b=666): print(a,b)func(456)func(123,888)s='小强'.center(30,'*')print(s)
HR录入名单
def Infor_entry(username,sex='男'): with open('name_list',encoding='utf-8',mode='a')as f1: f1.write('{}\t{}\n'.format(username,sex))while True: username=input('请输入姓名(男生以1开头):').strip() if '1'in username: username=username[1:] Infor_entry(username) else: Infor_entry(username,'女')
模拟len()函数 初期
# 重复代码多,可读性差 def my_len(): l=[1,2,3,4,5,6,7] count = 0 for i in l: count+=1 print(count)my_len()
升级
def my_len(a):#a 形式参数,也可以是b,c 等等,用于接收实参 count = 0 for i in a: count+=1 return countl=[1,2,3,4,5,6,7]my_len(l)#l,s 都是实参,实际存在的print(my_len(l))s='forjoivomv,vpoeqkg'my_len(s)print(my_len(s))
def tes(a, b, c): print(111) print(a, b, c)tes(22, 'zdd', [11, 22, 33])#一一对应,实参形参数量相等def func(x, y,): print(x, y)func(y=3333, x=4)#一一对应,实参形参数量相等,实参顺序可变def func1(x, y, z): print(x, y, z)func1(111, 222, z=555) # 混合传参 位置参数必须再前面func1(111, y=555, 222) # 报错def func2(y, x): print(x, y)func2(1, 2)def func2(y, x, z=100): print(x, y, z)func2(1, 2, 3000)def max(a,b): if a>b : return a else: return bprint(max(1,2))
三元运算
'''def max(a,b): c=a if a>b else b return cprint(max(33,678),type(max(5,6)))#678 def max(a,b): return a if a>b else bprint(max(455,298))def max (a,b):return a if a>b else b'''
实参角度
位置参数一一对应,实参形参数量相等关键字参数一一对应,实参形参数量相等,实参顺序可变混合参数(位置参数,关键字参数)关键字参数必须在位置参数后面# 形参角度位置参数一一对应,实参形参数量相等默认参数默认参数必须放在形参的位置参数后面默认参数不传值则为默认值,传值则覆盖默认值。动态参数
def input_information(name,sex='男'):? with open ('information',encoding='utf-8',mode='a') as f1: f1.write('{}\t{}\n'.format(name,sex))while True: msg=input('请输入用户的姓名,性别\Q或者q退出').strip() if msg.upper()=='Q':break if ','in msg: name1,sex1=msg.split(',') input_information(name1,sex1) else: input_information(msg)
写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素, 并将其作为新列表返回给调用者。
def odd_number(a): list=[] for i in range(len(a)): if i % 2==1: list.append(a[i]) return listl1=[1,2,3,4,5,6,7,8,9,10]print(odd_number(l1))set=(1,2,3,4,5,6,7,8,9,10)print(odd_number(set))
def func2(argv): return argv[1::2]# 切片的妙用l1=[1,2,3,4,5,6,7,8,9,10]print(func2(l1))
升级:两个列表合并一起测
def func2(*args): return args[1::2]#*在函数定义时是聚合l1=[1,2,3,4,5,6,7,8,9,10]l2=[11,12,13,14,15,16]print(func2(*l1,*l2))#*在函数调用时是打散
写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
def my_len(a): count=0 for i in a: count+=1 if count>5: return True else: return Falses='bihtjjj'print(my_len(s))l=[1,'xiaoqiang',333,666,888,'您好']print(my_len(l))set=(1,333,666,888)print(my_len(set))def func3(argv): return True if len(argv) > 5 else False# 三元运算,简单的判断可用s='jfjklhuggu'print(func3(s))
写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容, 并将新内容返回给调用者。
def lenth(a): list = [] count=0 for i in a: count+=1 if count>2: return a[:2] else: return al=[1,2,3,4]print(lenth(l))def func4(argv):return argv[:2]#巧用切片,不到指定长度也不报错。l=[1,2,3,4]print(func4(l))
写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数,并返回结果。
figure, abc, blank, other = 0, 0, 0, 0 #当变量是可迭代时,可以不用global,内部也能使用。def num(a): global figure, abc, blank, other#global,声明一个全局变量。把全局变量变成局部变量。 #也可以不用global,直接把figure, abc, blank, other = 0, 0, 0, 0 放到函数里面使用。 for i in a: if i.isdigit(): figure+=1 elif i.isalpha(): abc+= 1 # elif i==' ': # blank += 1 elif i.isspace():#也可以是 elif i==' ': blank += 1 #blank += 1 else: other+=1 result= '该字符串中数字有{}个,字母{}个,空格{}个,其他{}个'\ .format(figure,abc,blank,other) return results='jkjfF 46CD44* $'print(num(s))
写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容, 并返回结果。
def empty_content(a): for i in a: if i==' ': return Trues='hufhicdw jkjjo'print(empty_content(s))
写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容, 并将新内容返回给调用者。 dic = {"k1": "v1v1", "k2": [11,22,33,44]} PS:字典中的value只能是字符串或列表
def func7(argv): for i in argv: argv[i] = argv[i][:2]#切片 一定要多加练习 return argvdic = { "k1": "v1v1", "k2": [11, 22, 33, 44]}print(func7(dic))
写函数,接收两个数字参数,返回比较大的那个数字。
def max(x,y): return x if x>y else yprint(max(466,123))
写函数,用户传入修改的文件名,与要修改的内容,执行函数, 完成整个文件的批量修改操作(进阶)。
import os #引入的模块尽量放到外面def func(path,old_content,new_content): #函数可以把题目写活 with open(path,encoding='utf-8') as f1,\ open(path+'bak',encoding='utf-8',mode='w')as f2: for line in f1: new_line=line.strip().replace(old_content,new_content) f2.write('%s\n' % new_line) #%s\n的话,第一行会空着,没有内容。 os.remove(path) os.rename(path+'bak',path)func('modification','xiaohua','NB')
写一个函数完成三次登陆功能,再写一个函数完成注册功能(进阶)
def login(): i=1 while i<4: username =input('请输入你的账号:Q或者q退出').strip() password =input('请输入你的密码:Q或者q退出').strip() if username.upper()=='Q'or password.upper()=='Q': break elif username =='zhangsan'and password =='123': print('恭喜你登录成功') break else: print('你的账号或者密码错误,请重新登录,还剩余%d次机会' % (3-i)) i+=1login() def regisster(): flag=True while flag: username = input('请输入你的账号:Q或者q退出').strip() password =input('请输入你的密码:Q或者q退出').strip() if username.upper()=='Q'or password.upper()=='Q': # global flag flag=False else: dic={ 'name':'zhangsan','pass':'123'} if username not in dic['name']: print('您还没有账号,请注册') username = input('请输入你的账号:Q或者q退出').strip() password = input('请输入你的密码:Q或者q退出').strip() if username.upper() == 'Q' or password.upper() == 'Q': # global flag flag = False else: dic = { 'name': 'zhangsan', 'pass': '123'} if username not in dic['name']: password1 = input('请再次输入你的密码:Q或者q退出').strip() if password==password1: print('恭喜你登录成功') else: print('您两次输入的密码不一致,请重新输入').strip() else: print('您输入的账号已经存在,请重新注册') username = input('请输入你的账号:Q或者q退出').strip() password = input('请输入你的密码:Q或者q退出').strip()regisster()
def regisster(): flag=True while flag: username = input('请输入你的账号:Q或者q退出').strip() password =input('请输入你的密码:Q或者q退出').strip() if username.upper()=='Q'or password.upper()=='Q': # global flag flag=False else: with open('register',encoding='utf-8') as f1: for line in f1: line=line.split() if username not in line[0]: print('您还没有账号,请注册') username = input('请输入你的账号:Q或者q退出').strip() password = input('请输入你的密码:Q或者q退出').strip() if username.upper() == 'Q' or password.upper() == 'Q': flag = False else: if username not in line[0]: password1 = input('请再次输入你的密码:Q或者q退出').strip() if password==password1: print('恭喜你登录成功') with open ('register',encoding='utf-8',mode='a') as f1: f1.write('\n'+ username + password) else: print('您两次输入的密码不一致,请重新输入').strip() else: print('您输入的账号已经存在,请重新注册') username = input('请输入你的账号:Q或者q退出').strip() password = input('请输入你的密码:Q或者q退出').strip()regisster()def register(): while True: dic={ { 'username':'zhangsan','password':'123'},} username = input('请输入你的账号:Q或者q退出').strip() password =input('请输入你的密码:Q或者q退出').strip() if username not in dic['username']: print('您输入的用户不存在,请完成登录') username = input('请输入你的账号:Q或者q退出').strip() password1 = input('请输入你的密码:Q或者q退出').strip() if username == dic['username']: print('用户名已经存在,请重新登录') else: password2 = input('请再次确认密码:Q或者q退出').strip() if password1==password2 : print('恭喜你注册成功') else: password2 = input('您两次输入密码不一致,请再次确认密码:Q或者q退出').strip()def login_3(): dic = { 'name': ['小狗'], 'password': ['123']} flag=True while flag: choice=input('登录请输入L\l;注册请输入R\r').strip() if choice.upper()=='L': i=0 while i<3: username=input('请输入用户名:').strip() password=input('请输入密码:').strip() if username in dic['name'] and password in dic['password']: print( '登录成功') i=5 flag=False else: print( '用户名或者密码有误,您还有%s次登录机会' % (2-i)) if i==2: flag = False i += 1 elif choice.upper()=='R': new_username=input('请输入要注册的用户名:').strip() new_password=input('请输入注册密码:').strip() dic['name'].append(new_username) dic['password'].append(new_password) print('注册成功')# print(login_3())login_3()