记录学习《流畅的python》的一些知识-----元组(1)

今天开始记录我学习《流畅的python》的过程

2020.12.26

元组是一种很强大的可以用作记录来用的数据类型,它的第二个角色则是充当一个不可变的列表。
记录数据:
from collections import namedtuple
City = namedtuple(‘City’, ‘name country population coordinates’)
City._fields
LatLong = namedtuple(‘LatLong’, ‘lat long’)
delhi_data = (‘Delhi NCR’, ‘IN’, 21.935, LatLong(28.613889, 77.208889))
delhi = City._make(delhi_data)
print(delhi._asdict())

for key,value in delhi._asdict().items():
print(key + ‘:’ , value)
运行结果:
在这里插入图片描述

切片:为什么切片和区间会忽略最后一个元素。
l = [10, 20, 30, 40, 50]
print(l[:2]) # 在下标2的地方分割

print(l[2:])

print(l[:3]) # 在下标3的地方分割

print(l[3:])

运行结果:
在这里插入图片描述
对对象进行切片:
s[a : b : c]指的是在a和b之间以c为间隔取值,c为负为反向取值。
例1:
s = ‘bicycle’

print(s[::3])
print(s[::-1])
print(s[::-2])

运行结果:
在这里插入图片描述
例2:
invoice = “”"
… 0…6…40…52…55…
… 1909 Pimoroni PiBrella $17.50 3 $52.50
… 1489 6mm Tactile Switch ×20 $4.95 2 $9.90
… 1510 Panavise Jr. - PV-201 $28.00 1 $28.00
… 1601 PiTFT Mini Kit 320×240 $34.95 1 $34.95
“”"

SKU = slice(0, 6)
DESCRIPTION = slice(8, 40)
UNIT_PRICE = slice(40, 52)
QUANTITY = slice(52, 55)
ITEM_TOTAL = slice(55, None)
line_items = invoice.split(’\n’)[2:]
for item in line_items:
print(item[UNIT_PRICE], item[DESCRIPTION])

运行结果:

上面invoice中的很多点被省略了,请自行添加合适的数量以及更改切片的位置。

多维切片和省略:

如a[m:n, k:l],进行二维切片

对切片进行赋值:

l = list(range(10))
print(l)

l[2:5] = [20, 30]
print(l)

del l[5: 7]
print(l)

l[3::2] = [11, 22]
print(l)

l[2:5] = [100]
print(l)

运行结果为:
在这里插入图片描述
所要注意的是2:5表示的是第3个元素到第5个元素。也就是把2,3,4替换成20,30。

对序列使用+和(*):

l = [1, 2, 3]
print(l * 5)
t = 5 * ‘abcd’
print(t)

运行结果:
在这里插入图片描述
建立由列表组成的列表
board = [[’_’] * 3 for i in range(3)]
print(board)

board[1][2] = ‘X’
print(board)
相当于是:
board = []
for i in range(3):
row = [’_’] * 3
board.append(row)
print(board)

运行结果:
在这里插入图片描述
错误的捷径:
weird_board = [[’_’] * 3] * 3
print(weird_board)

weird_board[1][2] = ‘0’
print(weird_board)

相当于是:
row = [’_’] * 3
board = []
for i in range(3):
board.append(row)

运行结果:
在这里插入图片描述
序列的增量赋值:
*为就地乘法
展示的是在可变和不可变序列上的作用。
在这里插入图片描述
排序

list.sort方法和内置函数sorted
前者为就地排序,不会把原来的列表复制一份,而后者是返回一个列表,可以接受任何形式的可迭代对象作为参数,甚至包括不可变序列或生成器。

fruits = [‘grape’, ‘raspberry’, ‘apple’, ‘banana’]
print(sorted(fruits))

print(fruits)

print(sorted(fruits, reverse = True))

print(sorted(fruits, key = len))

print(sorted(fruits, key = len, reverse = True))

print(fruits)

print(fruits.sort())

print(fruits)

运行结果:
在这里插入图片描述
用bisect来管理已排序的序列

import bisect
import sys

HAYSTACK = [1, 4, 5, 6, 8, 12, 15, 20, 21, 23, 23, 26,29,30]
NEEDLES = [0, 1, 2, 5, 8, 10, 22, 23, 29, 30, 31]

ROW_FMT = ‘{0:2d} @ {1:2d} {2}{0:<2d}’

def demo(bisect_fn):
for needle in reversed(NEEDLES):
position = bisect_fn(HAYSTACK, needle)
offset = position * ’ | ’
print(ROW_FMT.format(needle, position, offset))

if name == ‘main’:

if sys.argv[-1] == 'left':
    bisect_fn = bisect.bisect_left

else:
    bisect_fn = bisect.bisect

print('DEMO:', bisect_fn.__name__)
print('haystack ->', ' '.join('%2d' % n for n in HAYSTACK))
demo(bisect_fn)

#根据一个分数,找到它所对应的成绩
def grades(score, breakpoints=[60, 70, 80, 90], grades=‘FDCBA’):
i = bisect.bisect(breakpoints, score)
return grades[i]

print([grades(score) for score in [33, 99, 77, 70, 89, 90, 100]])、

运行结果:
在这里插入图片描述
用bisect.insort插入新元素

import bisect
import random

SIZE = 7
random.seed(1729)

my_list = []
for i in range(SIZE):
new_item = random.randrange(SIZE*2)
bisect.insort(my_list, new_item)
print(’%2d ->’ % new_item, my_list)
运行结果:
在这里插入图片描述
seed( ) 用于指定随机数生成时所用算法开始的整数值。 如果使用相同的seed( )值,则每次生成的随即数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同,设置的seed()值仅一次有效。

randrange() 方法返回指定递增基数集合中的一个随机数,基数默认值为1。
import random
random.randrange ([start,] stop [,step])
注意:randrange()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值