python 的高级用法(1)

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赞,代码可以直接跑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值