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))
来源: http://www.bubuko.com/infodetail-3204295.html