Q1:写函数,将传入的列表或元祖对象的奇数位索引对应的元素,
eg:13位置,作为新列表返回给调用者
def func(lst):
# 要封装一个list()函数,因为题目要求返回一个列表
return list(lst[1::2])
print(func([1,2,3,4,5,6,7,8,9,]))
Q2:写函数,判断用户传入的对象(string,list,tuple)长度是否大于5
重点:如何减少代码量
def func(s):
# return可以返回一个功能性语句,
return len(s) > 5
print(func("123456"))
Q3:写函数,计算传入的string中,数字,字母,空格以及其它内容的个数,并返回结果
重点:复习isdigit(),isalpha(),isspace(判断是否是空白字符,\n,\t,空格等)
def func(s=''):
num=0
alpha=0
space=0
others=0
for c in s:
if c.isdigit():
num += 1
elif c.isalpha():
alpha +=1
elif c == ' ':
space += 1
else:
others += 1
return {'num':num,'alpha':alpha,'space':space,'others':others}
print(func(" 23 4 jjjsds32 /.,;[ e3e3e32e23e3dj9"))
Q4:写函数,接收两个数字参数,返回较大的那个数字
重点:三目运算,学会把简单的功能代码放到return后面
def func(a,b):
return a if a > b else b
print(func(10,15))
Q5:写函数,函数接收的4个参数分别是:姓名,性别(默认为男),年龄,学历
用户通过input输入这4个内容(支持持续输入,Q或q退出),并传递给函数
函数接收到这些内容,将其追加到student_msg文件中
重点:复习文件操作
def func(name,age,edu,gender='男'):
f = open('student_msg',mode='a',encoding='utf-8')
f.write(name+'_'+gender+'_'+age+'_'+edu+'\n')
f.flush()
f.close()
while 1:
NAME=input("请输入你的名字:")
GENDER=input("请输入你的性别:")
AGE=input("请输入你的年龄:")
EDU=input("请输入你的学历:")
if GENDER == '':
func(NAME,AGE,EDU)
else:
func(NAME,AGE,EDU,GENDER)
content = input("录入完毕,是否还要继续输入(输入q就退出):")
if content.upper() == 'Q':
break
Q6:写函数,用户传入要修改的文件名,与要修改的内容.执行函数,完成文件的批量修改操作
重点:复习文件的修改
import os
def modify_file(fileName,oldContent,newContent):
with open(fileName,mode="r+",encoding="utf-8") as f1,\
open(fileName+"_副本",mode="w+",encoding="utf-8") as f2:
for line in f1:
line = line.replace(oldContent,newContent)
f2.write(line)
os.remove(fileName)
os.rename(fileName+"_副本",fileName)
modify_file("student_msg","1","a")
Q7:(难),写函数,具备注册(要有去重的功能),与3次登录的功能
重点:先写注册,把内容写到文件中去,核心是写去重.再写登录,可采用账号加密码双重验证的格式
# 先写注册函数
def regist():
uname=input("请输入用户名:")
f = open("userInfo",mode="r",encoding="utf-8")
# 核心就是去重,去重肯定是一行一行去匹配的
for line in f:
un = line.strip().split("_")[0]
if uname == un:
print("用户名已存在,请重新输入")
return
# 易错点,else应该与for平级,因为是当for执行完了,还没找到重名,才去执行else的
else:
print("用户名可用!")
upwd=input("请输入密码:")
f = open("userInfo",mode="a",encoding="utf-8")
f.write(uname+"_"+upwd+"\n")
f.flush()
f.close()
# 再写登录函数
def login():
count = 1
while count <= 3:
uname = input(f"请输入登录的用户名(还有{4-count}次机会):")
upwd = input("请输入登录的密码:")
f = open("userInfo",mode="r",encoding="utf-8")
for line in f:
name, pwd = line.strip().split("_")
# if有多重方式可写,最好的还是同时验证账号和密码
if uname == name and upwd == pwd:
print("登录成功")
return True # 对于正常的操作,可以返回True,方便后面调用,eg: if login(): ...
else:
print("登录失败,用户名或密码错误")
count += 1
print("次数已用完")
return False
# regist()
# regist()
# regist()
login()
# Q8:写函数,接收n个数字,返回这些数字的和(动态传参)
重点:学会用*args来接收n个位置参数
def func(*args):
sum = 0
for el in args:
sum += el
return sum
print(func(1,2,3,4,5,6,4,4,3))
Q9:理解打印出来的a,b,c分别是什么,为什么?
重点:理解return的默认返回值None,理解函数里面收到的a,b是没有用上的
a,b = 10,20
def func(a,b):
a, b = 3,5
print(a,b)
c=func(b,a)
print(c)
print(a,b)
Q10:在实参中传入多个可迭代对象(要有string,list,tuple,set,dict),将每个对象的每个元素都加到args或kwargs里
重点:利用实参中的*和**来进行打散,**用于dict
def func(*args,**kwargs):
print(args,kwargs)
s="hello"
func(*[1,2,3],*(3,3,),*{"name","height"},**{"name":"jiang","age":18})
Q11:写函数,把传过来的列表中的每一个元素都用"_"拼接,并返回
例如,传过来[1,"哈哈",2,"哦"],返回"1_哈哈_2_哦"
重点:join()只能处理字符串,所以要结合for循环才行
def func(lst):
sum=""
for el in lst:
sum += str(el)+"_"
return sum[:-1] # 要去掉最后一个_下划线
print(func([1,"哈哈",2,"哦"]))
Q12:写函数,传入一个数字,返回这个数的阶乘
重点:累乘,学会李永range函数的步长
def func(num):
sum=1
for i in range(num,0,-1):
sum *= i
return sum
print(func(10))
Q13:写函数,返回一个扑克牌列表,里面有52项,每一项都是一个tuple
例如:[("红心","2"),("梅花","2")...("方块","A")]
重点:笛卡尔积的代码要记一记
def func():
lst=[]
style = ["红心","梅花","方块","黑桃"]
number = ["A","1","2","3","4","5","6","7","8","9","10","j","q","k"]
for i in style:
for j in number:
lst.append((i,j))
return lst
print(func())
Q14:使用2中以上的方法,让inner函数运行
重点:return是可以返回函数,或变量,也就是内存地址的
# 第1种方法
def func():
def inner():
print("666")
inner()
func()
# 第2种方法
def func():
def inner():
print("666")
print("in",inner) # 与下面的out对比,可发现,地址是一样的,说明内存空间是可以返回的
return inner
i = func()
i()
print("out",i)
# 第3种方法
def func():
def inner():
print("666")
return inner
func()()
Q15:用代码写一个99乘法表
重点:笛卡尔积,确定外层循环,再确定内层循环,最后去掉换行符
for i in range(1,10):
for j in range(1,i+1):
print("%s * %s = %s" %(i,j,i*j),end="\t")
print()
Q16:解释为什么list1和list3结果是一样
重点:因为函数执行在最前面,意味着形参里面的list在最开始就创建了
而当再次执行函数的时候,并不会重新开辟内存,仍然会使用上次开辟的那一块
def fn(val,list=[]):
print(id(list))
list.append(val)
return list
list1=fn(3)
list2=fn(10,list=[])
list3=fn("a")
print(list1) # [3, 'a']
print(list2) # [10]
print(list3) # [3, 'a']
print(id(list1)) #list1,list3,以及函数里面的list的id是一样的
print(id(list2))
print(id(list3))