那些年在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等语言是有所不同的,Python的for循环内部变量的改变对于循环体的循环变量参数不会改变,改用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



被折叠的 条评论
为什么被折叠?



