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}]