分享

Python 代码简化以及匿名函数_python 简化函数

 nxhujiee 2023-05-17 发布于宁夏

三元表达式

三元表达式,在条件二选一的时候比较推荐使用。

不使用三元表达式情况下的 if 语句:
		
		if len('XWenXiang') > 6:
    		print(111)
		else:
    		print(222)


代码会显得复杂不精简,使用三元表达式:

		print(111) if len('XWenXiang') > 6 else print(222)

使用后一行代码会显得很精简。

三元表达式语法:


		语句A if 条件 else 语句B
		
		条件如果成立也就是 True 使用 语句A
		条件如果不成立也就是 False 使用 语句B

表达式应用:

		x = 'XWenXiang' if '大帅哥' else '假的'
		print(x)

注意点:

三元表达式不建议使用嵌套,也就是 if 嵌套

代码示例:

		(print(111)if 1>2 else print(222)) if len('XWenXiang')>6 else print(333)

示例中代码这样看起来语法不简洁,所以不推荐使用

		if len('XWenXiang') > 6:
		    if 1 > 2:
		        print(111)
		    else:
		        print(222)
		else:
		    print(333)

此时使用原本的样式反而层次更简洁。
三元表达式可以看作是 if 的简写,不过 if 也可以这么写:
		
		if len('XWenXiang') > 6:print(111)
		else:print(333)

生成式

注意点,没有元组生成式,因为依据这种写法的称之为迭代器

列表生成式

列表生成式:该技术主要可以简化代码

举例说明

list_a = ['X', 'W', 'Xiang']
---给定一个列表,如果我们要在列表的每个元素后面加字符串'_abc',首先有可能想到的是对列表进行循环
相加后添加到新的列表中---
		
		list_a = ['X', 'W', 'Xiang']
		list_b = []
		for i in list_a:
		    i += '_abc'
		    list_b.append(i)
		print(list_b)

但是这种看上去会比较复杂,我们可以用列表生成式来进行简化

		list_a = ['X', 'W', 'Xiang']
		list_b = [i + '_abc' for i in list_a]
		print(list_b)

这种方式使代码更加简洁,首先定义一个列表用于接收改变后的元素,将 for 循环语句放在新列表的括号里,
for 循环语句的前面放循环变量,让循环变量作为新列表的元素,这时候我们就可以对其进行修改操作。

我们也可以在列表生成式中进行 if 条件判断

代码示例一:
		list_a = ['X', 'W', 'Xiang']
		list_b = [i + '_abc' for i in list_a if len(i) > 3]
		print(list_b)

不同的是,在 for 循环后有着一个 if 判断语句,这样可以满足我们的筛选要求。
代码示例二
使用生成式也可以简洁的对列表内的所有元素增值

		list_a = [1, 2, 3, 4, 5]
		list_b = [i + 1 for i in list_a if i != 3]
		print(list_b)

打印结果:
		[2, 3, 5, 6]
		
上面的代码中,首先遍历了列表 list_a 中的元素,判断元素是否等于 3 ,不等于 3 的所有元素先加 1
在放入新列表,而等于 3 的元素则会直接被跳过。

字典生成式

有列表生成式也就有字典生成式,主要的功能也是简化代码。

举例说明一
		
list_a = ['name', 'age', 'pwd']
list_b = ['XWenXiang', 18, 123]
---给定俩个列表,使其中的元素按照顺序分别作为键名和键值来组成一个字典,我们会先创建一个空字典用
于接收数据,然后按照索引取出列表里的数据并当作键值对---

		list_a = ['name', 'age', 'pwd']
		list_b = ['XWenXiang', 18, 123]
		dict_a = {}
		for i in range(len(list_a)):
		    dict_a[list_a[i]] = list_b[i]
		print(dict_a)

这种方式看起来很复杂不简洁,我们可以通过字典生成式来使用。

		list_a = ['name', 'age', 'pwd']
		list_b = ['XWenXiang', 18, 123]
		dict_a = {list_a[i]: list_b[i] for i in range(len(list_a))}
		print(dict_a)

和列表生成式一样,先进行 for循环,循环出来的就是列表中各个元素的索引,所以此时可以将俩列表中的元
素用索引取出并按照字典的键值对形式排列存到空字典。

同样的,在字典生成式里也可以添加 if 判断条件进行筛选


		list_a = ['name', 'age', 'pwd']
		list_b = ['XWenXiang', 18, 123]
		dict_a = {list_a[i]: list_b[i] for i in range(len(list_a)) if i != 1}
		print(dict_a)

在这我写的 if 是当索引不为 1 的时候添加到空字典中。

集合生成式

集合生成式也一样,也有 for 循环和 if 判断

注意点,创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

		set_a = {i for i in range(10) if i != 4}
		print(set_a)
		

匿名函数

匿名函数看着名字也能猜到它是一个没有函数名字的函数,它不用关键字 def 来声明函数名。
lambda函数能接收任何数量的参数,返回一个值


命名匿名函数的语法格式为: lambda 形参:返回值

代码示例一

		y = lambda x: x + 2
		print(y(1))

我们可以通过这种方式直接使用
如果不用匿名函数的方式来实现的话:

		def index(x):
		    return x+2
		
		print(index(1))

相对行数会多些。

获取最大值

代码示例二
---获取最大值---

如果是数字列表我们直接使用方法 max() 就行

		list_a = [1, 23, 4, 45, 32, 56, 67, 34, 97]
		print(max(list_a))
		
但是如果是字典使用 max() 方法会怎么样呢?

		dict_a = {'a': 123128, 'b': 24543, 'c': 6764}
		print(max(dict_a))
 
输出的结果是 c ,明明字典中 a 的键值最大却输出了键值最小的 c ,在字典中使用 max() 其实比的是键
名,如果键名是字符串,那么会按照 ASCII码表 来对字符串进行比较。

我们去看 max()的原格式:

		def max(*args, key=None) 
 
'''其中 key 后面跟的是函数名,注意没有括号,当有 key 值函数名的时候,函数返回了什么就比较什么,
可以理解为 key 值用来设置比较的规则。'''

所以我们可以改变 key 的值来比较字典键值大小,有下列俩种方法:

1. 方式一
		dict_a = {'a': 123128, 'b': 24543, 'c': 6764}
		def index(x):
		    return dict_a[x]
		print(max(dict_a, key=index))

定义一个函数 index() 并定义形参 x ,返回函数值是字典的键值。使用 max()并将参数 key 的值设为函
数名 index ,此时比较的内容就是字典的键值,比较完 max() 返回的值是字典的键名。

2. 方式二
方式二是对方式一的简略写法,使用了匿名函数

	dict_a = {'a': 123128, 'b': 24543, 'c': 6764}
	print(max(dict_a,key=lambda x:dict_a[x]))

3. 方式三

	dict_a = {'a': 123128, 'b': 24543, 'c': 6764}
	print(max(dict_a,key=dict_a.get))

使用 get方法也能达到同样的效果。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多