PythonNote7_List Comprehension(列表推导式)和lambda表达式

参考:http://www.opython.com/343.html

31 列表推导式(List Comprehension)

形如 lst = [x * x for x in range(1, 7)] 称为列表推导式

除了迭代取出元素和设定计算方法形成列表,列表推导式还能够设置条件,满足条件的元素才能够经过计算添加到列表。

列表推导式组成:[元素(或计算方法) for循环(允许多个) if语句]

示例代码:

lst = [x * x for x in range(1, 7) if x % 2 == 0]  # 列表推导式:循环获取范围1~6的整数,符合条件时,计算乘积后添加到新列表。
print(lst)  # 显示输出结果为:[4, 16, 36]
列表推导式的循环问题:

在列表推导式中有多个循环式,出现的是嵌套循环的效果,而非同步循环。

示例代码(嵌套循环):
number = [1, 2, 3, 4, 5, 6]  # 整数列表
square = [1, 4, 9, 16, 25, 36]  # 平方列表
lst = ['{0}²={1}'.format(str(x), str(y)) for x in number for y in square if x <= 3]
print(lst)

Python 字符串format()格式化函数:
format 函数可以接受不限个参数,位置可以不按顺序。

基本语法:

>>>"{} {}".format("hello", "world")    # 不设置指定位置,按默认顺序
'hello world'
 
>>> "{0} {1}".format("hello", "world")  # 设置指定位置
'hello world'
 
>>> "{1} {0} {1}".format("hello", "world")  # 设置指定位置
'world hello world'

print("姓名:{name}, 年龄:{age}".format(name='Lo',age='21'))
姓名:Lo, 年龄:21

还可以传入对象、格式化数字等,详情参考:https://www.runoob.com/python/att-string-format.html

输出结果:

['1²=1', '1²=4', '1²=9', '1²=16', '1²=25', '1²=36', '2²=1', '2²=4', '2²=9', '2²=16', '2²=25', '2²=36', '3²=1', '3²=4', '3²=9', '3²=16', '3²=25', '3²=36']
示例代码(同步循环):
number = [1, 2, 3, 4, 5, 6]  # 整数列表
square = [1, 4, 9, 16, 25, 36]  # 平方列表
lst = ['{0}²={1}'.format(str(x), str(y)) for x in number for y in square if x <= 3 and x * x == y]
print(lst) # 显示输出结果为:['1²=1', '2²=4', '3²=9']

等价于以下代码:

number = [1, 2, 3, 4, 5, 6]
square = [1, 4, 9, 16, 25, 36]
lst = [] # 此部分用列表推导式替代
for x in number: # 此部分用列表推导式替代
    for y in square: # 此部分用列表推导式替代
        if x <= 3 and x * x == y: # 此部分用列表推导式替代
            lst.append('{0}²={1}'.format(str(x), str(y))) # 此部分用列表推导式替代
print(lst)

32 lambda表达式

lambda表达式的官方定义:一个匿名内联函数,由一个表达式组成,在函数被调用时求值。

创建lambda函数的语法: lambda [参数] : 表达式

lambda表达式可用于函数的参数。

示例代码(实现序列中偶数判断):

def iseven(n):  # 定义验证数字是否偶数的函数
    if n % 2 == 0:  # 判断参数是否为偶数
        return True  # 符合条件返回真值
    else:
        return False #否则返回假值

lst = list(filter(iseven, number)) # 通过函数iseven对每个number的元素进行验证,验证为真的保留,并将最终结果转换为list。
print(lst) # 显示输出结果为:[2, 4, 6]

等价代码:

number = [1, 2, 3, 4, 5, 6]  # 整数列表

lst = list(filter(lambda x: x % 2 == 0, number)) # 通过lambda表达式对每个number的元素进行验证,并将所有验证结果转换为list。
print(lst) # 显示输出结果为:[2, 4, 6]

上方代码中,每一个number的元素都会作为lambda表达式的参数(冒号前面的x)进行验证,如果符合条件(冒号后方的表达式),则会保留元素。

Python3 filter()函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list()。 来转换。filter()函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

基本语法:filter(function, iterable),

function为判断函数,iterable 为可迭代对象。

def is_odd(n):
    return n % 2 == 1
 
tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
newlist = list(tmplist)
print(newlist)

PS:关于一段代码的运行

示例代码:

name_set = {'邢佳栋', '李学庆', '高昊', '潘粤明', '戴军', '薛之谦', '贾宏声', '于波', '李连杰', '王斑', '蓝雨', '刘恩佑', '任泉', '李光洁', '姜文', '黑龙', '张殿菲', '邓超', '张杰', '杨坤', '沙溢', '李茂', '黄磊', '于小伟', '刘冠翔', '秦俊杰', '张琳', '陈坤', '黄觉', '邵峰', '陈旭', '马天宇', '杨子', '邓安奇', '赵鸿飞', '马可', '黄海波', '黄志忠', '李晨', '后弦', '王挺', '何炅', '朱亚文', '胡军', '许亚军', '张涵予', '贾乃亮', '陆虎', '印小天', '于和伟', '田亮', '夏雨', '李亚鹏', '胡兵', '王睿', '保剑锋', '于震', '苏醒', '胡夏', '张丰毅', '刘翔', '李玉刚', '林依轮', '袁弘', '朱雨辰', '丁志诚', '黄征', '张子健', '许嵩'}

print(list(filter(lambda x: x[0] == '李', [x for x in name_set])))

如果报错提示识别不了utf-8字符,是因为py默认用acsii编码,要在脚本第二行加上utf-8编码,必须是第二行!

上述代码意为选出序列中姓李的人并形成新序列,因为不是编码问题的编码问题浪费了很多时间,希望后来人如果有看到的注意,避开我们踩过的坑,同行才能走得更远,也更快!

你可能感兴趣的:(Python)