函数入门练习题1-16

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))

转载于:https://www.cnblogs.com/jiangzongyou/p/11548790.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值