1、 for- else
else 不一定必须和 if 搭配,还可以和for搭配使用,例如
for i in [1,2,3,4]:
print(i)
else:
print(i, "我是else")
# 输出
# 1
# 2
# 3
# 4
# 4 我是else
如果 for 和 else 之间有 if ,也不会影响 for 和 else 之间的关系,因为 for 的级别比 else 高,所以不管有没有 if 的存在,执行完 for 后都会执行 else,例如
for i in [1,2,3,4]:
if i > 2:
print(i)
else:
print(i, "我是else")
# 输出
# 3
# 4
# 4 我是else
如果想打破 for 和 else 之间的关系,可以使用 break,例如
for i in [1,2,3,4]:
if i > 2:
print(i)
break
else:
print(i, "我是else")
# 输出
# 3
2、*args和**kwds
Python函数支持默认参数可变参数,*args表示不限数量的单值参数,**kwds表示不限数量的键值对参数。
def multi_sum(*args):
s = 0
for item in args:
s += item
return s
multi_sum(3,4,5)
# 输出
# 12
Python函数允许同时全部或部分使用固定参数、默认参数、单值(一颗星)可变参数、键值对(两颗星)可变参数,使用时必须按照前述顺序书写。例如
def do_something(name, age, gender='男', *args, **kwds):
print('姓名:%s,年龄:%d,性别:%s'%(name, age, gender))
print(args)
print(kwds)
do_something('caixukun', 50, '男', 175, 75, math=99, english=90):
# 输出
# 姓名:caixukun,年龄:50,性别:男
# (175, 75)
# {'math': 99, 'english': 90}
3、三元表达式
y = 5
x = -1 if y < 0 else 1
print(x)
# 输出
# 1
a = list(range(0, 10))
b = [0 if item < 5 else 1 for item in a]
print(a)
print(b)
# 输出
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
4、列表的高级操作
4.1 解包
把一个列表拆分成一个一个元素
>>> elems = [1, 2, 3, 4]
>>> a, b, c, d = elems
>>> print(a, b, c, d)
1 2 3 4
也可以这样
>>> a, *new_elems, d = elems
>>> print(a, new_elems, d)
1 [2, 3] 4
4.2 切片
>>> a = [0,1,2,3,4,5]
>>> a[::2] # 从第一个元素起,每2个元素取一个
[0, 2, 4]
>>> a[1::2]
[1, 3, 5]
>>> a[::-1] #从倒数第一个元素起,每1个元素取一个
[5, 4, 3, 2, 1, 0]
>>> a[::-2]
[5, 3, 1]
>>>
[x:y:z] 这种语法的意思是,从索引x到索引y,每z个元素取一个。
如果z是负数,就是反向取了。
如果x不特别指定,就默认是在遍历列表的方向上,遇到的第一个元素。
如果y不特别指定,就默认是列表最后一个元素。
可以使用切片删除列表里面的偶数
>>> elems = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del elems[::2]
>>> print(elems)
[1, 3, 5, 7, 9]
4.3 插入
如果想把某个索引处的一个元素,替换成多个元素,比如把1换成20,30,40,例如
>>> elems = list(range(10))
>>> elems[1:2] = [20, 30, 40]
>>> print(elems)
[0, 20, 30, 40, 2, 3, 4, 5, 6, 7, 8, 9]
如果想把3个值 0.2, 0.3, 0.5 插在索引0和索引1之间,例如
>>> elems = list(range(10))
>>> elems[1:1] = [0.2, 0.3, 0.5]
>>> print(elems)
[0, 0.2, 0.3, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4.4 扁平化list
使用sum()函数来扁平化一个装有多个list的list
>>> list_of_lists = [[1], [2, 3], [4, 5, 6]]
>>> sum(list_of_lists, [])
[1, 2, 3, 4, 5, 6]
5、Lambda, map, filter, reduce
lambda 用于创建内联函数,它的快速声明让lambda函数非常适用于回调和作为参数传入其它函数。
>>> lambda x,y: x+y
<function <lambda> at 0x00000285B70FD268>
>>> (lambda x,y:x+y)(3,4)
7
当lambda函数被用于搭配 map 函数,fillter 函数,reduce 函数时会变得非常有用。
搭配 map 函数
def square_fn(x):
return x * x
nums = [1/3, 333/7, 2323/2230, 40/34, 2/3]
nums_squared_1 = map(square_fn, nums)
nums_squared_2 = map(lambda x: x * x, nums)
print(list(nums_squared_1))
print(list(nums_squared_2))
# 输出
# [0.1111111111111111, 2263.0408163265306, 1.0851472983570953, 1.384083044982699, 0.4444444444444444]
# [0.1111111111111111, 2263.0408163265306, 1.0851472983570953, 1.384083044982699, 0.4444444444444444]
使用 map 来计算一个简单线性函数 f(x)=ax+b 的均方误差(MSE),下面两种方法是等同的。
a, b = 3, -0.5
xs = [2, 3, 4, 5]
labels = [6.4, 8.9, 10.9, 15.3]
errors = []
for i, x in enumerate(xs):
errors.append((a * x + b - labels[i]) ** 2)
result1 = sum(errors) ** 0.5 / len(xs)
diffs = map(lambda x, y :(a * x + b -y) ** 2, xs, labels)
result2 = sum(diffs) ** 0.5 /len(xs)
print(result1, result2)
# 输出
# 0.35089172119045514 0.35089172119045514
filter(fn, iterable)和 map 用法是一样的,只不过在fliter(fn, iterable)中,fn是用于过滤掉不符合条件的iterable值,然后返回True或False,最后将返回True的元素放到新列表中。
errors = list(range(10))
bad_preds = filter(lambda x:x > 5, errors)
print(list(bad_preds))
# 输出
# [6, 7, 8, 9]
要注意的是,map 和 filter 返回的是迭代器(Iterator),这就是说它们的值不是存储的,是按需生成的。
当调用了sum(diffs)之后,diffs就被清空了,如果想要保留diffs里面的所有元素,就用list(diffs)把它转换成一个列表。
reduce(fn,iterable,initializer)是用来给列表里的所有元素,迭代的应用某一个算子:用传给reduce中的函数fn(有两个参数)先对集合中的第1、2个元素进行操作,得到的结果再与第三个数据用function函数运算,最后得到一个结果。
求一个列表里面所有元素的乘积
nums = list(range(1, 10))
from functools import reduce
produce = reduce(lambda x, y:x * y, nums)
print(produce)
# 输出
# 362880
参考:
[1] Python10大装B语法
[2] 英伟达小姐姐的Python隐藏技巧合集,推特2400赞,代码可以直接跑