python cookbook 学习笔记 第一章 数据结构和算法(1)解压序列赋值给多个变量

  • 解压序列赋值给多个变量
  • 问题:
  • 有一个包含N个元素的元组或者序列,怎样将里面的值解压后同时赋给N个变量
  • 解决方案:
    任何的序列(或可迭代对象)都可以通过一个简单的赋值语句解压并赋值给多个变量。
    唯一的前提是变量的数量必须和序列元素的数量是一样的
p = (4, 5)
x, y = p

print(x)  

print(y)  

data = ["ACME",50,91.1,(2012,12,21)]
name, shares, price, date = data

print(name) 
print(date)  

print(name,shares,price,date)  
  • 字符串,文件对象,迭代器和生成器 都可以用这种方法赋值
s = "hello"
a, b, c, d, e = s
print(a) 
  • 如果只解压一部分,丢弃其他的值,可以用任意变量名去占位,到时候丢掉这个变量就行了。
  • 要保证占位变量名在其他地方没有被使用到
data = ["ACME", 50, 91.1, (2012,12,21)]
_, shares, price, _ = data

print(price)  
  • 解压可迭代对象给多个变量
  • 问题:
  • 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个ValueError。 那么这样才能从这个可迭代对象中解压出N个元素。
  • 解决方案:
  • python的星号表达式可以解决这个问题。
record = ("Dave","dave@example.com","773-555-1212","847-555-1212")
name, email, *phone_numbers = record

print(name)   --->Dave
print(phone_numbers)    ---> ['773-555-1212', '847-555-1212']

**注意:**phone_numbers 这个变量解压出来的永远是列表类型

  • 星号表达式也能用在列表的开始部分
*trailing, current = [10,8,7,1,9,8,10,3]

print(trailing) 
print(current)
  • 扩展的迭代解压语法是专门为解压不确定个数或任意个数元素的可迭代对象涉及的。 通常,这些可迭代对象的元素结构有确定的规则(比如第一个元素后面都是电话号码),星号 表达式让开发人员可以容易的利用这些规则来解压出元素来。
  • 值得注意的是,星号表达式在迭代元素为可变长元组的序列时是很有用的。 比如下面是一个带有标签的元组序列:
records = [
    ("foo", 1, 2),
    ("bar", "hello"),
    ("foo", 3, 4)
]

def do_foo(x, y):
    print("foo", x, y)

def do_bar(s):
    print("bar", s)

for tag, *args in records:
    if tag == "foo":
        do_foo(*args)
    elif tag == "bar":
        do_bar(*args)
  • 星号解压语法在字符串操作的时候也会很有用,比如字符串的分割
line = "nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false"
uname, *fields, homedir, sh = line.split(":")

print(uname)
print(fields)  
print(homedir)  
print(sh)
  • 有时候,解压一些元素后想丢弃它们,不能简单实用*,可以实用一个普通的废弃名称. 比如_或者ign。
record = ("ACME",50,123.45,(12,18,2012))
name, *_, (*_, year) = record

print(name)
print(year)  
  • 可以用分割语法去实现递归算法。递归不是python擅长的。因此对这个不要太认真。
items = [1,10,7,4,5,9]

def sum(items):
    head, *tail = items
    return head + sum(tail) if tail else head

print(sum(items)) 
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值