~~做过的好玩的题~~
lis = [1, 2]
for i in lis:
lis.append(i)
print(lis)
# 这是一个死循环,每一次循环,都是再往列表里添加一个元素
# 当下次循环列表的时候,长度就变了
# 这样就会一直循环,不会停止
不通过clear()来清空列表
lst = [1, 2, 3, 4]
for i in lst:
lst.pop()
print(lst)
# [1, 2]
for 循环是不能够往回走的,比如我第一次for i in lst 那我的 i 拿到的就是0
无论我列表怎么变,我第二次for i in lst 那我拿到的 i 就是1
所以 上述循环,先删掉标号3,再删掉标号2,然后就循环完了,就跳出了
lst = [1, 2, 3, 4]
for i in lst:
lst.pop(0)
print(lst)
# [3, 4]
原因同上,本质上就是循环两次!
lst = [1, 2, 3, 4]
for i in lst:
lst.remove(i)
print(lst)
# [2, 4]
一样的原因~
lst = [1, 2, 3, 4]
for i in lst:
del lst[i]
print(lst)
# IndexError: list assignment index out of range
很明显 一步一步循环来看
第一次循环,没什么问题
第二次就出问题了,此时若是执行 del lst[i] 删掉的就是列表角标为 3 的元素
而整个列表的最大角标也才是 2 ,所以就报错了!
那我们可不可以这么想,我循环一遍列表的长度,然后删最后一个数,不就行了吗?
那我们就可以这样来操作:
lst = [1, 2, 3, 4]
for i in range(len(lst)-1,-1,-1):
del lst[i]
print(lst)
# []
当然我们也可以直接”写死“这一段程序
lst = [1, 2, 3, 4]
for i in range(len(lst)):
del lst[-1]
print(lst)
# []
还有一种比较“讨巧”的方式,那就是我人为的复制出一个列表来,然后循环复制出来的列表
这样既不耽误原来的,也能够达到目的
lst = [1, 2, 3, 4]
lst1 = lst.copy()
for i in lst1:
lst.remove(i)
print(lst)
# []
讲道理熬!如果你对深浅拷贝不是很了解,建议这里直接用深拷贝!
import copy
lst = [1, 2, 3, 4]
lst1 = copy.deepcopy(lst)
for i in lst1:
lst.remove(i)
print(lst)
# []
不通过clear()来清空字典
dic = dict.fromkeys("12345", 1)
for i in dic:
dic.pop()
print(dic)
# RuntimeError: dictionary changed size during iteration
报错了?就算没有达成目的,也不能报错啊?(毕竟隔壁的列表都没有报错)
这是因为,字典的迭代的时候,改变了原来的大小,就会报错
(虽然列表也变了,但还是不报错,你气不气?)
那就用取巧的方法呗!
dic = dict.fromkeys("12345", 1)
dic1 = dic.copy()
for i in dic1:
dic.pop(i)
print(dic)
# {}
一招鲜!吃遍天!
深浅copy
import copy
a = [1, 2, 3, 4, ['a', 'b']]
b = a # 引用,除非直接给a重新赋值,否则a变则b变,b变则a变
c = copy.copy(a) # 浅复制,只会拷贝父对象, 不会拷贝父对象中的子对象,所以若a的子对象变则c 变,但是父对象变c不会变
d = copy.deepcopy(a) # 深拷贝,完全拷贝,完全独立于原对象,a变也不变
a.append(5) # 改变父对象
a[4].append('c') # 改变父对象中的 ['a', 'b']子对象
'''
a=[1, 2, 3, 4, ['a', 'b','c'],5]
b=[1, 2, 3, 4, ['a', 'b','c'],5]
c=[1, 2, 3, 4, ['a', 'b','c']]
d=[1, 2, 3, 4, ['a', 'b']]
'''
'''
1.写函数,计算传入数字参数的和。(动态传参)
2.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作
3.写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。
4.写函数,检查传入字典的每-个value的长度 如果大于2,那么仅保留前两个长度的内容(对value的值进行截断) ,并将新内容返回给调用者,注意传入的数据可以是字符、list. dict
5.解释闭包的概念
6.写函数,返回一个扑克牌列表,里面有52项,每-项是一个元组
1.例如: [(红心’,2).(‘草花’,2), .黑桃A']
7.写函数,传入n个数,返回字典'max :最大值, min' :最小值}
例如:min_ max(2,5,7,8,4)返回:{ 'max' :8, 'min' :2}
8.写函数,专门计算圆形的面积
。其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积。调用函数area(“圆形 ,圆半径)返回圆的面积
。调用函数area("正方形,边长)返回正方形的面积。调用函数area(”长方形”,长,宽)返回长方形的面积
#代码模板
def area():
def计算长方形面积():
pass
def计算正方形面积():
pass
def计算圆形面积():
pass
9.写函数,传入-个参数n,返回n的阶乘
例如:cal(7)
计算7*6*5*4*3*2*1
10.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功-次,后续的函数都无需再输入用
户名和密码
11.生成器和迭代器的区别?
12.生成器有几种方式获取value?
13.通过生成器写一个日志调用方法, 支持以下功能
。根据指令向屏幕输出日志。根据指令向文件输出日志
。根据指令同时向文件&屏 幕输出8志
。以上日志格式如下
2017-10-19 22:07:38 [1] test log db backup 3
2017-10-19 22:07:40 [2] user alex login success
#注意:其中[1], [2]是指自日志方法第几次调用,每调用-次输出一条日志
o代码结构如下
def logger(filename , channel-'file'):
"""
日志方法
:param filename: log filename
:param channel: 輸出的目的地,屏幕(terminal), 文件(file), 屏幕+文件(both):
return:
"""
. .your code...
#调用
log_obj = logger(filename="web.log" , channel= 'both' )
log_obj._ .next_ _ O
log_obj.send('user alex login success ')
14.用map来处理字符串列表把列表中所有人都变成sb,比方alex sb
name=[ ' alex','wupeiqi ','yuanhao', ' nezha' ]
15.用filter函数处理数字列表,将列表中所有的偶数筛选出来
num=[1,3,5,6,7,8]
16.如下,每个小字典的name对应股票名字,shares对应多 少股,price对应股票的价格
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1}, {'name': 'AAPL', ' shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': ' YHOO', ' shares': 45, 'price': 16.35}, {'name': 'ACME', 'shares': 75, 'price': 115.65}]
。通过哪个内置函数可以计算购买每支股票的总价
。用filter过滤出, 单价大于100的股票有哪些
17.有列表li = ['alex, 'egon', 'smith', pizza', 'alen'],请将以字母“a'开头的元素的首字母改为大写字母;18.有列表Ii = ['alex, 'egon', 'smith', pizza', 'alen'],请以列表中每个元素的第二个字母倒序排序;
19.有名为poetry. txE的文件,其内容如下,请删除第三行;
昔人已乘黄鹤去,此地空余黄鹤楼。
黄鹤-去不复返,白云千载空悠悠。
晴川历历汉阳树,芳草蔞蔞鸚鹉洲。
日暮乡关何处是?烟波江上使人愁。
20.有名为username . txt的文件,其内容格式如下,写一个程序,判断该文件中是否存在"alex",如果没有,则将字符
串"alex"添加到该文件末尾,否则提示用户该用户已存在;
'''
# 1
def sum(num, *args):
for i in args: num = num + i
print(num)
sum(1, 2, 3, 4, 5, 6, 7, 8, 9)
# 2
import os
def func(filename, old_str, new_str):
f1 = open(filename, "r+")
f2 = open(filename + ".new", "w+")
for i in f1.readlines():
if old_str in i:
i = i.replace(old_str, new_str)
f2.write(i)
f1.close()
f2.close()
os.remove(filename)
os.rename(filename + ".new", filename)
func("123.txt", "肉", "*")
# 3
def func(a):
for i in enumerate(a):
if i[1].isspace():
print("存在空值")
break
else:
print("没有空值")
a = ["", "da", " "]
func(a)
# 4
def func(a):
if type(a) is dict:
for i in a.keys():
if len(a[i]) > 2:
a[i] = a[i][0:2]
return a
elif type(a) is list:
count = 0
for i in a:
if len(i) > 2:
a[count] = i[:2]
count += 1
return a
elif len(a) > 2:
return a[:2]
print(func(a))
# 6
li = []
card_color = ["黑桃", "红心", "梅花", "方块"]
card_num = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"]
for i in card_color:
for j in card_num:
li.append((i, j))
print(li)
# 7
def max_min(*args):
li = []
for i in args:
li.append(i)
li.sort()
print('{"max":%s,"min":%s}' % (li[len(li) - 1], li[0]))
max_min(1, 8, 9, 6, 3, 7, 4, 5, 69, 8, 1, 5, 5, 1, 11, 3312, 64, 84, 0, 0, 6, 26, -1, -8, -9)
# 8
def area(x, *args):
def 长方形(x, y):
print(x * y)
pass
def 正方形(x):
print(x ** 2)
pass
def 圆形(r):
print(3.14 * (r ** 2))
pass
eval(x + "(*args)")
area("正方形", 3)
# 9
def func(n):
num = 1
for i in range(1, n + 1):
num *= i
print(num)
func(4)
# 10
db = {
"user": "123",
"pwd": "456",
"is": True
}
def login(func):
def inner(*args, **kwargs):
while db["is"]:
user = input("姓名:")
pwd = input("密码:")
if user == db["user"] and pwd == db["pwd"]:
print("登陆成功!")
db["is"] = False
else:
print("登录失败!")
func(*args, **kwargs)
return inner
@login
def 长方形(x, y):
print(x * y)
pass
@login
def 正方形(x):
print(x ** 2)
pass
def 圆形(r):
print(3.14 * (r ** 2))
pass
正方形(3)
长方形(2, 3)
圆形(2)
# 14
name=[ ' alex','wupeiqi','yuanhao', ' nezha' ]
print(list(map(lambda x:x+" sb",name)))
# 15
num = [1, 3, 5, 6, 7, 8]
print(list(filter(lambda x: x % 2 == 0, num)))
# 16
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1}, {'name': 'AAPL', ' shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': ' YHOO', ' shares': 45, 'price': 16.35}, {'name': 'ACME', 'shares': 75, 'price': 115.65}]
print(list(filter(lambda i: i["price"] > 100, portfolio)))
# 17
li = ['alex', 'egon', 'smith', 'pizza', 'alen']
for index, i in enumerate(li):
if i.startswith("a"):
li[index] = i.capitalize()
print("修改完成!")
print(li)
# 18
li = ['alex', 'egon', 'smith', 'pizza', 'alen']
li2 = []
for i in li:
li2.append((i[1], i))
li2.sort()
li = []
for i in li2[::-1]:
li.append(i[1])
print(li)
# 19
import os
f = open("123.txt", "r+")
f1 = open("123.txt.new", "w+")
count = 0
for i in f.readlines():
if count == 2:
count += 1
continue
count += 1
f1.write(i)
f.close()
f1.close()
os.remove("123.txt")
os.rename("123.txt.new", "123.txt")
# 20
f = open("123.txt", "r+")
if "alex" not in f.read():
f.write("alex")
print("已添加")
else:
print("有")
f.close()
小姐姐的一道问题
v1 = {'alex', '武sir', '黑哥'}
v2 = []
while True:
a = input("请输入:")
if a.upper() != "N":
if set(a) < v1:
v2.append(a)
else:
v1.add(a)
else:
break
print(v1, v2)