那些年在Python上遇到的奇奇怪怪的魔法和一些坑 想起来就写...

那些年在Python上遇到的奇奇怪怪的魔法和一些坑

哔哩哔哩

魔法测

1.输入多元素的方式
a,b=map(int,input().split())
a=list(map(int,input().split()))
a=[int(i) for i in input().split()] 
2.列表切片
object[start_index:end_index:step]

取值方式为[start_index, end_index),含左不含右,每step取一个值,和for循环同理
默认start_index=0,end_index=len(object),step=1,即

object[:]==object[::]==object[0:len(object):1]  #True

当指定step<0时,即步长为负,倒着取值,默认start_index=-1,end_index=-len(object)-1
就是从最后一个元素,到倒数第len(object)个,end_index也可以取正值,即

object[::-2]==object[-1::-2]==object[-1:-len(object)-1:-2]  #True
3. for , if , else神奇的写法
(1)for 循环简写
[fun(i) for i in list]  #在列表list中对每个元素i执行fun函数操作

等价于

for i in list:
	fun(i)

例如

l=[1,2,3,4]
[print(i,end=' ') for i in l]
-->1 2 3 4 
(2)双重for 循环
[funcation(i) for list in list_s for i in list]  
#在列表集合list_s中取出每个列表list再对list中每个元素i执行fun函数操作

等价于

for list in list_s:
    for i in list:
        fun(i) 

例如

lists = ['1234','abcd']
[print(i,end=' ') for j in lists for i in j]
-->1 2 3 4 a b c d 

还可以写成

lists = ['1234','abcd']
[[print(i,end=' ') for i in j] for j in lists]
-->1 2 3 4 a b c d 

但是不能在里面做赋值操作像,这样会报错

lists = [[1,2,3,4],[6,7,8]]
s=0
[s+=x for j in lists for i in j]
-->SyntaxError: invalid syntax 

除非闲的没事写成下面这样,不知道有没有其他方法,如果有请大神评论告知,万分感谢

lists = [[1,2,3,4],[6,7,8]]
s=0
def add(x):
    global s
    s+=x
[add(i) for j in lists for i in j]
print(s)
-->31

上面那串实质可以写成…

lists = [[1,2,3,4],[6,7,8]]
print(sum(i for j in lists for i in j))
(3)for ,if 循环判断
[fun_True() for i in list if Judge]
#在列表list中对每个元素i,当if后面的Judge判断为真时(想要为假可以加变成 if not Judeg) ,执行fun_True函数

等价于

for i in list:
	if Judge:
		fun_True()

例如

l=[1,2,3,4,5]
[print(i,end=' ') for i in l if i>3]
-->4 5 
(4)if ,else 简写
fun_True() if Judge else fun_False() 
#当判断Judge为真时执行fun_True,为假时执行fun_False()

等价于

if Judge:
	fun_True()
else:
	fun_False()

例如

l=[1,2,3,4,5]
for i in l:
    print(i if i>3 else -i,end=' ')
-->-1 -2 -3 4 5 

或者执行两个函数

for i in l:
    print(i,end=' ') if i>3 else print(i*2,end=' ')
-->-1 -2 -3 4 5 

还能赋值

x=[0]*5
for i in l:
    x[i-1]=i if i>3 else -i
print(x)
-->[-1, -2, -3, 4, 5]

也可以靠嵌套来得到if elif else的函数形式

for i in l:
    print(i if i>3 else (-i if i<2 else 0),end=' ')
-->-1 0 0 4 5 

还有其他神奇的写法,比如二维列表,利用True, False判断的0, 1当作列表索引,再返回列表的对应值

for i in l:
    print([i,-i][i>3],end=' ')  
  	##前面的值为假时执行的,因为假时索引为0
-->1 2 3 -4 -5 

传说中的黑客,利用逻辑运算符进行操作,奇奇怪怪的东西,反正我不会闲的没事用…
原理若and前为假则直接判断为假, 在例子中即返回-i, or前为真则判断为真, 返回i

for i in l:
    print((i>3 and [i] or [-i])[0],end=' ')
-->-1 -2 -3 4 5 
for i in l:
    print(i>3 and i or -i,end=' ')
-->-1 -2 -3 4 5 

科学侧

1.深浅拷贝
a=b='abc'
print(id(a),id(b))
b+='d'
print(a,b)
print(id(a),id(b))

-->1745381196784 1745381196784
-->abc abcd
-->1745381196784 1745390387440
a=b=[1,2,3]
print(id(a),id(b))
b+=[4]
print(a,b)
print(id(a),id(b))

-->1745422619656 1745422619656
-->[1, 2, 3, 4] [1, 2, 3, 4]
-->1745422619656 1745422619656
a=[1,2,3]
b=a[:]
print(id(a),id(b))
b+=[4]
print(a,b)
print(id(a),id(b))

-->1745422620296 1745422620040
-->[1, 2, 3] [1, 2, 3, 4]
-->1745422620296 1745422620040

虽然字符串和数组都可以按照index索引,但是存储类型不同,list如果地址相同就会同时修改,字符串则不会

2.for循环的循环变量

Python里面的for循环和c , java等语言是有所不同的,Pythonfor循环内部变量的改变对于循环体的循环变量参数不会改变,改用while就行了

a='123456789'
for i in range(len(a)):
    if i==5:
        a+='000'
    print(i,end=' ')
-->0 1 2 3 4 5 6 7 8
for i in range(len(a)):
    if i==5:
        i+=1
    print(i,end=' ')
-->0 1 2 3 4 6 6 7 8
i=0
while i<len(a):
    if i==5:
        a+='000'
    print(i,end=' ')
    i+=1
-->0 1 2 3 4 5 6 7 8 9 10 11
i=0
while i<len(a):
    if i==5:
        i+=1
    print(i,end=' ')
    i+=1
-->0 1 2 3 4 6 7 8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值