小小星号创奇迹:一个字符就能改变你编写Python代码的方式

开发 后端
Python还具备一些很酷的特点,比如装饰器和列表解析。这些特点确实能创造奇迹,但*也值得这一美名,小小字符能带来翻天覆地的变化。

本文转载自公众号“读芯术”(ID:AI_Discovery)。

Python以句法简单、简洁而闻名,只需掌握简单的英语就能理解其代码。对初学者来说极具吸引力,它没有声明,没有花哨的字符或者奇怪的句法。正因如此,Python才得以风靡全球。

[[331433]]

除此之外,Python还具备一些很酷的特点,比如装饰器和列表解析。这些特点确实能创造奇迹,但*也值得这一美名,小小字符能带来翻天覆地的变化。

先从一个小技巧开始:

  1. In [1]: 
  2. first_dict= {'key1': 'hello', 'key2': 'world'} 
  3. second_dict= {'key3': 'whats', 'key4': 'up'} 
  4. In [2]: 
  5. #joins the dicts 
  6. combined_dict= {**first_dict, **second_dict} 
  7. combined_dict 
  8. Out[2]: 
  9. {'key1': 'hello', 'key2': 'world', 'key3':'whats', 'key4': 'up'} 
  10. In [ ]: 

这是合并字典的超简单方法!你能明显看出,我仅用了几个星号就将字典结合了起来,我接下来会一一解释。

星号在哪些地方发挥作用?

除了众所周知的乘法作用,星号还能让你轻松完成一些重要任务,例如解包。一般来说,你可以使用星号来解包可迭代对象,也能对双向可迭代对象(就像字典一样)进行双重解包。

  1. In [7]: 
  2. # unpackingan iterable 
  3. [xfor x inrange(100)] == [*range(100)] 
  4. Out[7]: 
  5. True 
  6. In [8]: 
  7. #unpkacing dict keys 
  8. d = {'key1': 'A'} 
  9. list(d.keys()) == [*d] 
  10. Out[8]: 
  11. True 
  12. In [9]: 
  13. #unpacking whole dict 
  14. d == {**d} 
  15. Out[9]: 
  16. True 

解包的力量

不要破坏别人的代码

大家也越来越理解这一点,但仍然有人没有遵守。开发者写出的每一个函数都有其特征。如果函数被改变,那么所有基于你的代码而撰写的代码都会被破坏。

[[331434]]

图源:unsplash

我将介绍一种简单的方法,你可以为自己的函数增添更多功能性,同时也不会破坏其向后兼容性,最后你会得到更多的模块化代码。

在你的代码中输入*args和**kwrags,它们会将所有输入都解包进函数。单星号针对标准的可迭代对象,双星号针对字典类的双向可迭代对象,举例说明:

  1. In [1]: 
  2. defversion1(a, b): 
  3.     print(a) 
  4.     print(b) 
  5. In [2]: 
  6. version1(4,5) 
  7. In [3]: 
  8. #code breaks 
  9. version1(4,5,6) 
  10. --------------------------------------------------------------------------- 
  11. TypeError                                 Traceback(most recent call last) 
  12. <ipython-input-3-b632c039a799> in<module> 
  13.       1# code breaks 
  14. ----> 2 version1(4,5,6) 
  15.   
  16. TypeError: version1() takes 2 positionalarguments but 3 were given 
  17. In [4]: 
  18. defversion2(a, b, *args): 
  19.     print(a) 
  20.     print(b) 
  21.     
  22.     # new function. 
  23.     if args: 
  24.         for c in args: 
  25.             print(c) 
  26. In [5]: 
  27. version2(1,2,3,4,5) 
  28. In [6]: 
  29. #code breaks 
  30. version2(1,2,3,4,5, Extra=10
  31. --------------------------------------------------------------------------- 
  32. TypeError                                 Traceback(most recent call last) 
  33. <ipython-input-6-748b0aef9e5d>in <module> 
  34.      1 # code breaks 
  35. ----> 2 version2(1,2,3,4,5, Extra=10
  36.   
  37. TypeError: version2() got an unexpectedkeyword argument 'Extra' 
  38. In [7]: 
  39. defversion3(a, b , *args, **kwrags): 
  40.     print(a) 
  41.     print(b) 
  42.     
  43.     # new function. 
  44.     if args: 
  45.         for c in args: 
  46.             print(c) 
  47.             
  48.     if kwrags: 
  49.         for key, value inzip(kwrags.keys(), kwrags.values()): 
  50.             print(key,':', value) 
  51. In [8]: 
  52. version3(1,2,3,4,5, Extra=10
  53. Extra : 10 
  54. In [ ]: 

工作代码和破解代码

这个例子展示了如何使用args和kwargs来接收之后的参数,并留到将来使用,同时也不会破坏你函数中原有的call函数。

星号是Python中很重要的一部分,但却常常被我们忽略。事实上,我们平常没有注意到的关键点还有很多,值得我们去一点点探索。

 

责任编辑:赵宁宁 来源: 今日头条
相关推荐

2023-04-25 15:46:51

Python字符串

2020-09-18 14:23:50

字符

2022-11-24 08:01:57

bash脚本字符串

2019-12-16 09:26:05

Java设计操作系统

2021-07-26 10:58:07

Chromebook谷歌更新

2023-06-01 07:49:51

2022-12-08 15:55:52

JavaScript字符串

2023-08-15 09:00:00

人工智能破解密码

2019-01-08 09:23:16

Java字符串编码

2010-10-09 13:41:42

MySQL字符串

2014-10-27 15:21:40

程序员代码

2020-08-08 12:15:46

Python函数代码

2021-12-21 11:39:01

数据结构算法同构字符串

2013-04-09 10:23:08

编码规范编程语言

2020-11-03 18:36:37

面试字符串算法

2015-03-23 12:20:59

Mac版ChromeChrome崩溃

2018-10-28 17:28:48

2009-11-26 10:39:58

PHP字符串连接

2022-10-31 07:09:15

拷贝代码项目

2013-12-19 09:46:04

垃圾收集器
点赞
收藏

51CTO技术栈公众号