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