python新手入门笔记(七)——数学运算及序列操作

  • 内置函数
  • abs()
  • round()
  • pow()
  • divmod()
  • max min sum
  • eval()
  • int()、bin()、oct()、hex()
  • ord()、chr()
  • 序列操作
  • all
  • any
  • sorted、reversed
  • enumerate
  • zip
  • map
  • reduce
  • filter
  • 扩展


内置函数

abs()

求绝对值,进行数学分析的时候使用,一般情况下用不到。

round()

四舍五入

round(2.6)
>>>3

round(2.3333333, 2)
>>>2.33

pow()

pow() 方法返回 xy(x的y次方) 的值。
如果是pow(x, y[, z]),函数是计算x的y次方,如果z在存在,则再对结果进行取模,其结果等效于pow(x,y) %z。

内置函数pow(),和数学函数math.pow()的区别:
pow() 通过内置的方法直接调用,内置方法会把参数作为整型,而 math 模块则会把参数转换为 float。

divmod()

divmod(a,b) a除以b的结果和余数。

max min sum

max:求最大值,返回ASCII码最大的字符
min:求最小值,返回ASCII码最小的字符
sum:求和

eval()

执行字符串中的表达式,一般用来进行类型转换。

eval('4+3')
>>> 7

str1 = "['p','y','t','h','o','n']"
eval(str1)
>>> ['p','y','t','h','o','n']

int()、bin()、oct()、hex()

进制转换
int —— 十进制
bin —— 二进制
oct —— 八进制
hex —— 十六进制

ord()、chr()

ord():字符向ASCII编码转换
chr():ASCII编码向字符转换

ord('a')
>>> 97

chr(65)
>>> A

序列操作

all

判断真假,当序列全为真则True,有一假为False,空序列为True。

all([1,2,3,4,5])
>>> True

all([1,2,3,4,0])
>>> False

all([])
>>> True

any

判断真假,当序列有一真为True,空序列为False。

any([1,2,3,0])
>>> True

any([])
>>> False

sorted、reversed

排序和翻转

list1 = [4,1,6,7,8,3,2,5]
list1.sort() # 会改变列表本身,当print(list1.sort())时,会返回None,实际结果已经升序排序了,id不变
sorted(list1) # 不会改变本身,返回新的列表,创建新的id,list1的id仍然存在

# 关于reversed的应用
reversed(list1) # 结果翻转[5,2,3,8,7,6,1,4]
list1.sort(reverse=True) # 结果按降序排序
sorted(list1,reverse=True) # 同上

拓展:sorted(a,b),a为序列,b为key。key可以是任意符合规则的表达式。如下:

i = ['I','H','A','W','G','d','u','g','h','a','w','e']
print(sorted(i,key=str.lower)) # ['A', 'a', 'd', 'e', 'G', 'g', 'H', 'h', 'I', 'u', 'W', 'w']

enumerate

对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值。
一般用于读文件。

list1 = [1,2,3,4,5,6,7,8]
print(enumerate(list1)) # 这里返回的是一个对象,属于迭代器的一种,<enumerate object at 0x0000021CFE7F6900>
for i in enumerate(list1): # 迭代器都可用for循环显示其中包含的内容
    print(i) # 结果显示为元组,此处可自己做测试查看
print(dict(enumerate(list1))) # {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8}

上网查了一下,对于列表中存在字典要提取其中key所对应的value值,网上没有找到相关方法,可能是我的打开方式不对,在此做个例子记录一下:

li = [{'name':'xiaohong','socre':49},{'name':'lily','socre':70},{'name':'lixiaolong','socre':90},{'name':'pangdu','socre':70}]
for x,y in enumerate(li,1):
    print(x,y['name'],y['socre'])

enumerate打印出来的结果是一个又一个包含两个元素的元组,上述例子中,x,y分别对应元组里的编号和遍历出来的字典,此时只需要提取字典中的value值就行了,即y[‘key’]。

zip

用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

list1 = [1,2,3,4,5,6,7,8]
list2 = [2,3,4,5,6,7,8,9]
print(zip(list1,list2)) # 返回一个对象,也是迭代器,<zip object at 0x000001D6FFD769C0>
for i in zip(list1,list2): # 此处不做重复解释
    print(i)

如果要保留被除去的元素。进行如下操作。

from itertools import zip_longest
list1 = [1,2,3,4,5,6,7,8]
list2 = [2,3,4,5]
for i in zip_longest(list1,list2):
    print(i)

该操作可将缺失部分用None来填充。

map

map(function, iterable, …) 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新对象。

for i in map(str,[1,2,3,4,5,6]):
    print(i)
print(type(i))
print(list(map(str,[1,2,3,4,5,6])))

reduce

reduce一定要接受两个参数

from functools import reduce
print(reduce(lambda x,y:x+y,[1,2,3,4,5])) #15

上述例子是一个累加过程,相当于一个x += y的过程。
这里有种特殊情况,如果有第三个参数,该参数优先与序列第一个位置进行计算。

from functools import reduce
print(reduce(lambda x,y:x+y,['a','b','c','d'],'x')) # xabcd

filter

过滤作用

print(list(filter(lambda x:x%2, range(10))))# [1, 3, 5, 7, 9]

# 去除空字符串
print(list(filter(lambda s:s and s.strip(),['A','',None,'B','  ','C'])))
# 空字符串是假的,即False,

扩展

list1 = [1,2,3,4,5,6,7,8]
list2 = [2,3,4,5]
d1 = {'name':'zhangsan','age':17}
from itertools import chain # 同时遍历不同的序列,相当于序列相加:list1+list2
for x in chain(list1,list2,d1):
    print(x)

序列遍历的方法:enumerate,zip,chain