pythontuple_python:tuple 真是鸡肋吗

​ Python中元组是没有推导式的,但是我们可以通过生成器推导式创建元组。从形式上看,生成器推导式与列表推导式类似,只是生成器推导式使用小括号。列表推导式直接生成列表对象,生成器推导式生成的不是列表也不是元组,而是一个生成器对象。我们可以通过生成器对象,转化成列表或者元组。也可以使用生成器对象的__next__()方法进行遍历,或者直接作为迭代器对象来使用。不管什么方式使用,元素访问结束后,如果需要重新访问其中的元素,必须重新创建该生成器对象。

old_gen = (x*2 for x in range(5))

print(old_gen)print(tuple(old_gen))print(list(old_gen)) # 只能访问一次元素。第二次就为空了print(old_gen.__next__())new_gen = (x*2 for x in range(5)) # 需要再生成一次print(new_gen.__next__())print(new_gen.__next__())print(new_gen.__next__())>>> at 0x000001980EFACD58>

>>>(0, 2, 4, 6, 8)>>>[]>>>Error:StopIteration>>>0

>>>2

>>>4

①元组的核心特点是:不可变序列,因此我们经常将元组作为函数的入参使用

def func(param1, param2, *args):

print(param1, param2, args)

func(1, 2, 3)

func(1, 2)

func(1, 2, 3, 4)

>>>1 2 (3,)>>>1 2 ()>>>1 2 (3, 4)*args表示任意多个无名参数,类型为tuple。从输出结果我们看到args打印出来的是(3,)只有一个元素为3的元组,为了区分字符串跟元组,单个元素的元组后面需要加个","以作为区分。根据*任意多个无名参数这一特性,我们在字符串格式转换中经常会使用到,工作中我们会涉及到使用sql语句查询数据库而sql里的条件是可变的,这是我们可以通过format进行格式转换:old_tuple = ('abc', 1)

sql = 'SELECT * FROM database where t1 like "%{}%" and t2 = "{}"'sql = sql.format(*old_tuple)print(sql)

>>>SELECT * FROM database where t1 like "%abc%" and t2 = "1"如果有多组参数呢,我们可以将这些参数元组放到列表里然后进行遍历传参就行了。既然讲到了*args,那么顺便把**kwargs也讲一下,**kwargs表示创建一个名为 kwargs的空字典,该字典可接受任意多个外界传入的非关键字实参:def func(param1, param2, *args, **kwargs):

print(param1, param2, args, kwargs)func(1, 2, 3, key1="value1")>>>1 2 (3,) {'key1': 'value1'}**kwargs:可变字典传参是以键值对的形式传参的(key=value),广泛使用于类对象中类方法的传参,我们在调用一个类方法时,当你在输入参数的时候编辑器会智能提示你应该输入什么参数,例如提示"param=",其实就是该类的入参使用的就是字典类型入参。具体关于类的介绍后面再详细讲。②元组作为字典的键

元组可以作为字典的键,通过zip()方法:

tuple_1 = ("a", "b", "c")

tuple_2 = ("1", "2", "3")

print(zip(tuple_1, tuple_2).__next__())

print(dict(zip(tuple_1, tuple_2)))

>>>('a', '1')>>>{'a': '1', 'b': '2', 'c': '3'}③具名元组

namedtuple是继承自tuple的子类。namedtuple创建一个和tuple类似的对象,而且对象拥有可访问的属性。下面看个列子:

from collections import namedtuple

# 定义一个namedtuple类型User,并包含name,sex和age属性。

User = namedtuple('User', ['name', 'sex', 'age'])

# 创建一个User对象

user = User(name='kongxx', sex='male', age=21)

# 也可以通过一个list来创建一个User对象,这里注意需要使用"_make"方法

user = User._make(['kongxx', 'male', 21])

print user >>>User(name='user1', sex='male', age=21)

# 获取用户的属性

print user.name

print user.sex

print user.age

>>>'user1'>>>'male'>>>21

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值