流畅的python学习笔记(三):数据结构(1)

文章目录概述序列列表推导和生成器表达式列表推导和可读性列表推导同filter和map的比较笛卡尔积生成器表达式元组不仅仅是不可变的列表把元组用作记录元组拆包嵌套元组拆包具名元组切片对对象进行切片给切片赋值待续。。。概述本章讨论的内容几乎可以应用到所有的序列类型上,从我们熟悉的list,到 Python 3 中特有的 str 和 bytes。我还会特别提到跟列表、元组、数组以及队列有关的话题。序列最重要也最基础的序列类型应该就是列表(list)了。list 是一个可变序列,并且能同时存放不同类型的元
摘要由CSDN通过智能技术生成

概述

本章讨论的内容几乎可以应用到所有的序列类型上,从我们熟悉的list,到 Python 3 中特有的 str 和 bytes。我还会特别提到跟列表、元组、数组以及队列有关的话题。

序列

  • 最重要也最基础的序列类型应该就是列表(list)了。list 是一个可变序列,并且能同时存放不同类型的元素。我想你应该对它很了解了,因此让我们直接开始讨论列表推导(listcomprehension)吧。列表推导是一种构建列表的方法,它异常强大,然而由于相关的句法比较晦涩,人们往往不愿意去用它。掌握列表推导还可以为我们打开生成器表达式(generator expression)的大门,后者具有生成各种类型的元素并用它们来填充序列的功能。下面就来看看这两个概念
列表推导和生成器表达式
  • 列表推导是构建列表(list)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。如果你的代码里并不经常使用它们,那么很可能你错过了许多写出可读性更好且更高效的代码的机会。
列表推导和可读性
"""
列表推导式使用原则:只用列表推导式创建新的列表,并且尽量保持简短
如果列表推导式的代码超过了两行,建议使用for循环重写
"""

# 2_1 普通实现
def str_to_unicode1(symbols: str) -> list:
    """把一个字符串变成unicode码位的列表"""
    codes = []
    for symbol in symbols:
        codes.append(ord(symbol))

    return codes


# 2_1 列表推导式实现
def str_to_unicode2(symbols: str) -> list:
    """把一个字符串变成unicode码位的列表"""
    return [ord(symbol) for symbol in symbols]


if __name__ == '__main__':
    a = ")(@#$"
    unicode_a1 = str_to_unicode1(a)
    unicode_a2 = str_to_unicode2(a)
    print(unicode_a1)  # [41, 40, 64, 35, 36]
    print(unicode_a2)  # [41, 40, 64, 35, 36]

列表推导同filter和map的比较
  • filter 和 map 合起来能做的事情,列表推导也可以做,而且还不需要借助难以理解和阅读的 lambda 表达式
"""
    map(function, iterable, ...): 据提供的函数对指定序列做映射。Python 2.x 返回列表,Python 3.x 返回迭代器。
    filter(function, iterable):用于过滤序列,过滤掉不符合条件的元素。Python2.7 返回列表,Python3.x 返回迭代器
"""

if __name__ == '__main__':
    symbols = "&¥)(@#$~——"
    # 列表推导式
    beyond_ascii1 = [ord(s) for s in symbols if ord(s) > 127]
    # filter + map
    beyond_ascii2 = list(filter(lambda c: c > 127, map(ord, symbols)))
    print(beyond_ascii1)  # [65509, 8212, 8212]
    print(beyond_ascii2)  # [65509, 8212, 8212]
笛卡尔积

  • 使用列表推导可以生成两个或以上的可迭代类型的笛卡儿积
"""
    使用列表计算笛卡尔积
"""
if __name__ == '__main__':
    colors = ["black", "white"]
    sizes = ["S", "M", "L"]
    t = [(color, size) for color in colors for size in sizes]
    for e in t:
        print(e)
    	# ('black', 'S')
		# ('black', 'M')
		# ('black', 'L')
		# ('white', 'S')
		# ('white', 'M')
		# ('white', 'L')
  • 列表推导的作用只有一个:生成列表。如果想生成其他类型的序列,生成器表达式就派上了用场。
生成器表达式
'''
    虽然可以用列表推导来初始化元组、数组或其他序列类型,但是生成器表达式是更好的选择。
    这是因为生成器表达式背后遵守了迭代器协议,可以逐个产出元素,而不是先建立一个完整的列表,然后再把这个列表传递到某个函数里。
    生成器表达式的语法和列表推导式差不多,只不过把方括号换成了圆括号。
	
	如果生成器表达式是一个函数调用过程中的唯一参数,那么不需要额外再用括号把它围起来
'''


def generator_expression_tuple(symbols):
    """
    generator_expression_tuple(symbols:str) -> tuple

    生成器表达式生成元组
    """
    return tuple(ord(symbol) for symbol in symbols)


def generator_expression_array(symbols):
    """
    generator_expression_array(symbols:str) -> array

    生成器表达式生成数组
    """
    return array.array('I', (ord(symbol) for symbol in symbols))


if __name__ == '__main__':
    symbols = "$¢£¥€¤"
    t = generator_expression_tuple(symbols)
    print(t)  # (36, 162, 163, 165, 8364, 164)
    a = generator_expression_array(symbols)
    print(a)  # array('I', [36, 162, 163, 165, 8364, 164])
元组不仅仅是不可变的列表
  • 除了用作不可变的列表,它还可以用于没有字段名的记录
把元组用作记录
import os


if __name__ == '__main__':
    # 洛杉矶经纬度
    lax_coordinates = (33.9425, -118.6465774)
    # 东京市的一些信息:市名、年份、人口(单位:百万)、人口变化(单位:百分比)和面积(单位:平方千米)
    city, year, pop, chg, area = ("Tokyo", 2003, 32450, 0.66, 8014)
    # 元组列表
    traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856')]

    # 使用元组匹配 % 格式运算符
    for passport in sorted(traveler_ids):
        print("%s/%s" %<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值