【Python基础复习】那些容易踩坑的诡异操作

学习自华为云学院白泽老师《Python入门篇》课程

生成器

(i for i in range(10))
<generator object <genexpr> at 0x000001F6CB7E1AC0>

相互引用产生死循环

a = [1,2,3]
b = [3,4,5]

a.append(b)
b.append(a)
print(a)
print(b)
[1, 2, 3, [3, 4, 5, [...]]]
[3, 4, 5, [1, 2, 3, [...]]]
a = [""]*3
b = [a]*3
b[1][1] = 0
print(a)
print(b)
['', 0, '']
[['', 0, ''], ['', 0, ''], ['', 0, '']]
a, b = {}, 5
a[b] = a, b
print(a)
{5: ({...}, 5)}

lambda表达式&排序

# 排序
l = [(1, 2), (2, 4), (2, 3), (3, 2)]
l.sort(key=lambda x:(x[0],x[1]))
l
[(1, 2), (2, 3), (2, 4), (3, 2)]
# 列表删除元素
s = [99,100,46,44,68,50,59,50,59,66,89,54]
for i in s:
    if i < 60:
        s.remove(i)
        
s #有问题 [99, 100, 44, 68, 59, 59, 66, 89]
[99, 100, 44, 68, 59, 59, 66, 89]
# 列表删除元素
s = [99,100,46,44,68,50,59,50,59,66,89,54]
for i in s:
    if i < 60:
        s.pop(i)
s #IndexError: pop index out of range
---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-13-6bbb6dc14b89> in <module>
      3 for i in s:
      4     if i < 60:
----> 5         s.pop(i)
      6 s


IndexError: pop index out of range

列表在每一次循环当中都会动态变化,当元素被删,循环的列表索引下标发生改变,会直接影响循环过程

解决方法1:创建一份浅拷贝

import copy
s = [99,100,68,59,50,59,66,89,54]
s1 = copy.copy(s)
for i in s:
    if i < 60:
        s1.remove(i)
        
s1
[99, 100, 68, 66, 89]

解决方法2:列表推导式


import copy
s = [99,100,46,44,68,50,59,50,59,66,89,54]
[ i for i in s if i>=60 ]
[99, 100, 68, 66, 89]

解决方法3:倒着删,删除后避免元素迁移导致索引变化


s = [99,100,46,44,68,50,59,50,59,66,89,54]
for i in range(len(s)-1, -1, -1):
    print(i,":", s[i])
    if s[i] < 60:
        print('removing...')
        s.pop(i)
s
11 : 54
removing...
10 : 89
9 : 66
8 : 59
removing...
7 : 50
removing...
6 : 59
removing...
5 : 50
removing...
4 : 68
3 : 44
removing...
2 : 46
removing...
1 : 100
0 : 99





[99, 100, 68, 66, 89]

解决方法4:filter函数 + lambda表达式

s = [99,100,46,44,68,50,59,50,59,66,89,54]
list(filter(lambda x:x>=60, s))
[99, 100, 68, 66, 89]

浅拷贝和深拷贝

l = [1,2,3,[5,4]]
l1 = l.copy() #copy方法实现浅拷贝
import copy
l2 = copy.deepcopy(l)
l == l1 == l2
True
l1 is l
False
l2 is l
False
l1[3][1]=6
l
[1, 2, 3, [5, 6]]
l1
[1, 2, 3, [5, 6]]
l2
[1, 2, 3, [5, 4]]

诡异的运算符使用方法

不推荐,仅了解

(False == False) in [False]
False
False == (False in [False])
False
False == False in [False]
True
True is False == False
False
False is False is False
True
1 > 0 < 1  #等价于 1>0 and 0<1
True
(1 > 0 ) < 1
False
1 > (0 < 1)
False

操作符优先级:**最高, and or not最小

指定i不能打断循环

循环产生迭代器,循环只不过遍历已经生成完数值

# 循环产生迭代器,循环只不过遍历已经生成完数值
for i in range(4):
    print(i)
    i = 10
0
1
2
3

代码效率问题

# 判断是否感染新冠
COVID = 1  
if COVID:#避免没有必要的计算执行
    print("请隔离治疗")
else:
    print("通过")
请隔离治疗
# 排序
import random
l = [i for i in range(10)]
random.shuffle(l)
l
[7, 1, 8, 4, 5, 6, 9, 0, 2, 3]
temp = []

n = len(l)
for i in range(n):
    s = l[0]
    for i in range(len(l)):
        if l[i] < s:
            s = l[i]
            
    print(l)
    l.remove(s)
    temp.append(s)
    
    
temp
[7, 1, 8, 4, 5, 6, 9, 0, 2, 3]
[7, 1, 8, 4, 5, 6, 9, 2, 3]
[7, 8, 4, 5, 6, 9, 2, 3]
[7, 8, 4, 5, 6, 9, 3]
[7, 8, 4, 5, 6, 9]
[7, 8, 5, 6, 9]
[7, 8, 6, 9]
[7, 8, 9]
[8, 9]
[9]





[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

空间复杂度换时间复杂度

def quick_sort(arr):
    if len(arr) < 2:
        return arr
    # 选取基准,随便选哪个都可以,选中间的便于理解
    mid = arr[len(arr) // 2]
    # 定义基准值的左右两个数列
    left, right = [], []
    # 从原始数组中移除基准值
    arr.remove(mid)
    for item in arr:
        #大于基准值放右边
        if item >= mid:
            right.append(item)
        else:
            left.append(item)
    #使用递归迭代进行比较
    return quick_sort(left) + [mid] + quick_sort(right)

quick_sort([1, 10, 9, 5, 8, 0])
[0, 1, 5, 8, 9, 10]

装饰器

import time
def func(f):
    def inner(*args, **kwargs):
        start_time = time.time()
        f(*args, **kwargs)
        end_time = time.time()
        print('耗时:%s秒' % (end_time - start_time))
    return inner
# 装饰器就是在不改变原本代码情况下加入新的功能
@func
def test():
    time.sleep(1)

#相当于    
#func(test())
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容