Python高阶应用

1、条件表达式

# -*- coding:utf-8 -*-

import math
# 定义一个函数输入大于零取log,否则返回nan
def get_log(x):
  if x > 0:
    #技巧在jupyter中查看python内置函数方法:shift + tab
    y = math.log(x,10)
    #Docstring:
              #log(x[, base])
              #Return the logarithm of x to the given base

  else:
    y = float("nan")
  return y

x = 10
log_val1 = get_log(x)
print(log_val1)
1.0


# -*- coding:utf-8 -*-

import math
x = 10
log_val2 = math.log(x,10) if x > 0 else float('nan')
print(log_val2)
1.0

两种情况的结果是一样的,但代码的书写量却相差很大。

 

2. 列表推导式

下面代码在jupyter中执行:

# -*- coding:utf-8 -*-

%%timeit
# 找出100000内的偶数(for循环)
l1 = []
for i in range(100000):
    if i % 2 == 0:
        l1.append(i)
输出:11.1 ms ± 462 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
# 找出10000内的偶数(列表推导式)
l2 = [i for i in range(100000) if i % 2 == 0]
输出:7.25 ms ± 105 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

3. 浅拷贝和深拷贝

a = {1: [1,2,3]}
print('变量a的内存地址:', id(a))
print(a[1])
print('变量a中列表的内存地址:', id(a[1]))

输出:

变量a的内存地址: 1551593298680
[1, 2, 3]
变量a中列表的内存地址: 1551593472456

赋值:

b = a
print('变量b的内存地址:', id(b))
print('变量b中列表的内存地址:', id(b[1]))

输出:

变量b的内存地址: 1551593298680
变量b中列表的内存地址: 1551593472456

b地址和a的地址相同

浅拷贝:

c = a.copy()
print('变量c的内存地址:', id(c))
print('变量c中列表的内存地址:', id(c[1]))

输出:

变量c的内存地址: 1551592350056
变量c中列表的内存地址: 1551593472456

浅拷贝b的地址与a的地址不变

深拷贝:

# -*- coding:utf-8 -*-

import copy

a = {1: [1,2,3]}
d = copy.deepcopy(a)
print('变量d的内存地址:', id(d))
print('变量d中列表的内存地址:', id(d[1]))
输出:

变量d的内存地址: 1719012770952
变量d中列表的内存地址: 1718974996104

深拷贝 b与a的地址不同

4. map()函数

import math
l1 = [1, 3, 5, 20, 9]
l2 = [2, 4, 6, 8, 10]
#输出l1与l2中对应较小的一个
mins = map(min, l1, l2)
print(list(mins))

#对列表中的元素进行平方根操作
squared = map(math.sqrt, l2)
print(squared)
print(list(squared))

输出:

[1, 3, 5, 8, 9]
<map object at 0x00000169422AB630>
[1.4142135623730951, 2.0, 2.449489742783178, 2.8284271247461903, 3.1622776601683795]

5. 匿名函数 lambda

# -*- coding:utf-8 -*-

#计算a、b、c的乘机

my_func = lambda a, b, c: a * b * c
print(my_func)
print(my_func(1, 2, 3))

输出:
<function <lambda> at 0x0000026FD32DB488>
6

# -*- coding:utf-8 -*-
#lambda结合map
l1 = [1, 3, 5, 7, 9]
l2 = [2, 4, 6, 8, 10]
#计算函数x*2 + y,x在l1中,y为x对应的l2中的值
result = map(lambda x, y: x * 2 + y, l1, l2)
print(list(result))
输出:
[4, 10, 16, 22, 28]

6. 自定义排序

# -*- coding:utf-8 -*-

# 普通排序
a = [5, 1, 4, 3]
print(sorted(a)

输出:

[1, 3, 4, 5]

# 字符串排序,大小写敏感
strs = ['ccx', 'aaay', 'Dz', 'Bm']
print(sorted(strs))
print(sorted(strs, reverse=True))

输出:

['Bm', 'Dz', 'aaay', 'ccx']
['ccx', 'aaay', 'Dz', 'Bm']
# 按照字符串长度排序
print(sorted(strs, key=len))

输出

['Dz', 'Bm', 'ccx', 'aaay']

# 忽略大小写
print(sorted(strs, key=str.lower))

输出

['aaay', 'Bm', 'ccx', 'Dz']

# -*- coding:utf-8 -*-
# 自定义排序函数
# 按字符串最后的字符进行排序
def last_char(s):
    return s[-1]
strs = ["aa","cc","bb"]
print(sorted(strs, key=last_char))

输出:
['aa', 'bb', 'cc']

# -*- coding:utf-8 -*-

# 列表中为元组的排序
tuple_list = [('ETH', 194.78), ('BTC', 6292.56), ('EOS', 4.99)]

print(sorted(tuple_list, key=lambda item: item[0]))

输出:
[('BTC', 6292.56), ('EOS', 4.99), ('ETH', 194.78)]

# -*- coding:utf-8 -*-

# 字典列表排序
coin_list = [{'name': 'ETH', 'price': 194.78}, 
                 {'name': 'BTC', 'price': 6292.56},
                 {'name': 'EOS', 'price': 4.99}]
from operator import itemgetter
print(sorted(coin_list, key=itemgetter('name')))

输出:
[{'name': 'BTC', 'price': 6292.56}, {'name': 'EOS', 'price': 4.99}, {'name': 'ETH', 'price': 194.78}]

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值