~~做过的好玩的题~~

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)



posted @ 2019-07-01 00:00  吃夏天的西瓜  阅读(243)  评论(0编辑  收藏  举报