函数的初识
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 count
a='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 b
a=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 b
a=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 b
print(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('{} {}
'.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 count
l=[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 b
print(max(1,2))
三元运算
'''
def max(a,b):
c=a if a>b else b
return c
print(max(33,678),type(max(5,6)))#678 <class 'int'>
def max(a,b):
return a if a>b else b
print(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('{} {}
'.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 list
l1=[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 False
s='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 a
l=[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 result
s='jkjfF 46CD44* $'
print(num(s))
写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容,
并返回结果。
def empty_content(a):
for i in a:
if i==' ':
return True
s='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 argv
dic = {"k1": "v1v1", "k2": [11, 22, 33, 44]}
print(func7(dic))
写函数,接收两个数字参数,返回比较大的那个数字。
def max(x,y): return x if x>y else y
print(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
' % new_line) #%s
的话,第一行会空着,没有内容。
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+=1
login()
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('
'+ 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('登录请输入Ll;注册请输入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()