当下,Python 比以往的任何时候都更加流行,人们每天都在实践着 Python 是多么的强大且易用。

我从事 Python 编程已经有几年时间了,但是最近6个月才是全职的。下面列举的这些事情,是我最开始使用 Python 的时候,就希望清楚的:

  • 字符串操作
  • 列表推导
  • Lambda 和 Map 函数
  • 在一行里使用 if elif 和 else 条件判断
  • zip() 函数

字符串操作

Python 非常擅长使用类似数学运算符 + 和 * 来操作字符串

>>> my_string = "Hi Medium..!"
>>> print(my_string * 2)
Hi Medium..!Hi Medium..!
>>> print(my_string + " I love Python" * 2)
Hi Medium..! I love Python I love Python
复制代码

我们也可以非常方便的对字符串做取反操作,只需要使用 [::-1] 就可以,同时该操作还不仅仅局限于字符串操作。

>>> print(my_string[::-1])
!..muideM iH
>>> my_list = [1,2,3,4,5]
>>> print(my_list[::-1])
[5, 4, 3, 2, 1]
复制代码

那么对于包含多个字符串的列表呢,我们甚至可以做一个 Yoda-translator !

>>> word_list = ["awesome", "is", "this"]
>>> print(' '.join(word_list[::-1]) + '!')
this is awesome!
复制代码

在上面的代码中,我们使用了 .join() 方法,用空格把反转列表里的元素拼接了起来,并且增加了感叹号。

列表推导

哦,天啊!一旦我知道了这些,我的整个世界都改变了(可能还没有真实发生,但是已经接近了)。这是以中国强大的、直观的且可读的方法来快速的操作列表。

假如我们有这样一个函数,取一个数的平方再增加5Python学习交流群

>>> def stupid_func(x):219539519欢迎加入
>>>     return x**2 + 5
复制代码

现在如果我们要把该函数应用到一个列表的所有奇数当中,如果不了解列表推导式,你可能会这么写

>>> my_list = [1, 2, 3, 4, 5]
>>> new_list = []
>>> for x in my_list:
>>>     if x % 2 != 0:
>>>         new_list.append(stupid_func(x))
>>> print(new_list)
[6, 14, 30]
复制代码

但是我们还有更简单的方法!

>>> my_list = [1, 2, 3, 4, 5]
>>> print([stupid_func(x) for x in my_list if x % 2 != 0])
[6, 14, 30]
复制代码

列表推导适用于 [ expression for item in list ] 条件,同时如果那你想要应用一些布尔条件,例如上面获取奇数的条件: [ expression for item in list if conditional ],那么它和下面的写法是一致的

>>> for item in list:
>>>     if conditional:
>>>         expression
复制代码

很酷,不过我们还可以做的更好,因为我们根本不需要函数“stupid_func”

>>> print([x ** 2 + 5 for x in my_list if x % 2 != 0])
[6, 14, 30]
复制代码

Lambda 和 Map

Lambda

Lambda 有一点奇怪,但是就像我介绍的其他内容一样,只要你去只用它,就会发现它是多么的强大和直观。

Lambda 其实就是一个小的匿名函数。为什么要匿名呢?这是因为 Lambda 常常用来执行小型简单的操作,而这些操作往往不需要使用 def my_function() 来定义正式的函数

我们还是以上面的例子为例,对一个数进行平方并加5。在上面的代码中我们定义了一个函数 def stupid_func(x),现在让我们使用 Lambda 来重新创建它

>>> stupid_func = (lambda x : x ** 2 + 5)
>>> print([stupid_func(1), stupid_func(3), stupid_func(5)])
[6, 14, 30]
复制代码

那么,为什么要使用这种奇怪的语法呢?其实这种写法的用处就体现在,我们不要定义实际的功能,就可以实现一些简单的操作。我们继续以数字列表为例,如果我们想对下面的列表进行排序,一种方法是使用 sorted()

>>> my_list = [2, 1, 0, -1, -2]
>>> print(sorted(my_list))
[-2, -1, 0, 1, 2]
复制代码

这样确实可以了,但是,如果我们想按照元素平方数的大小来排序,使用 Lambda 就非常方便了。可以使用 Lambda 来定义 sorted() 函数用于排序的 key

>>> print(sorted(my_list, key = lambda x : x ** 2))
[0, -1, 1, -2, 2]
复制代码

Map

Map 是一个用来将函数应用到序列的每个元素上,比如列表。假设我们必须要列出两个列表对应位置元素的乘积,那么该怎么做呢,可以使用 Lambda 和 Map

>>> print(list(map(lambda x, y : x * y, [1, 2, 3], [4, 5, 6])))
[4, 10, 18]
复制代码

和下面的代码相比,Lambda 与 Map 的组合实在是太优雅了

>>> x, y = [1, 2, 3], [4, 5, 6]
>>> z = []
>>> for i in range(len(x)):
>>>     z.append(x[i] * y[i])
>>> print(z)
[4, 10, 18]
复制代码

在一行里使用 if elif 和 else 条件判断

有时,你可能会写出如下的代码

>>> x = int(input())
>>> if x >= 10:
>>>     print("Horse")
>>> elif 1 < x < 10:
>>>     print("Duck")
>>> else:
>>>     print("Baguette")
复制代码

运行此命令时,系统会提示你从 input() 函数输入内容,假设我们输入5,我们将得到 Duck。 但是我们也可以像下面这样写

print("Horse" if x >= 10 else "Duck" if 1 < x < 10 else "Baguette")
复制代码

这实在是太简单了!快去阅读你的旧代码,你会发现有太多的地方可以将这种简单的 if else 判断替换成这种单行判断。

zip()

还记得在 Map 函数部分,我们并行处理两个列表的例子嘛,使用 zip() 会更加简单

假如我们有两个列表,一个包含名字,一个包含姓氏,怎样才能很好的合并它们呢,使用 zip()!

>>> first_names = ["Peter", "Christian", "Klaus"]
>>> last_names = ["Jensen", "Smith", "Nistrup"]
>>> print([' '.join(x) for x in zip(first_names, last_names)])
['Peter Jensen', 'Christian Smith', 'Klaus Nistrup']
复制代码

哇哦,有个地方错了,我的名字不叫 Peter Jensen,那么就可以调整如下

>>> print([' '.join(x) for x in zip(first_names, last_names[::-1])])
['Peter Nistrup', 'Christian Smith', 'Klaus Jensen']

复制代码

结束语

我这里只是汇总了一个简单的清单,目的就是为了让你能够了解到 Python 可以优雅的做很多事情。如果你有任何不同的想法,可以留言哦!

每个新手程序员都必须知道的Python技巧的更多相关文章

  1. 每一位想有所成就的程序员都必须知道的15件事(走不一样的路,要去做,实践实践再实践,推销自己,关注市场)good

    从 为之漫笔作者:为之漫笔 有超过 100 人喜欢此条目 原文地址:How to advance your career? Read the Passionate Programmer! 我刚看完Ch ...

  2. 每个程序员都应该学习使用Python或Ruby

    每个程序员都应该学习使用Python或Ruby 如果你是个学生,你应该会C,C++和Java.还会一些VB,或C#/.NET.多少你还可能开发过一些Web网页,你知道一些HTML,CSS和JavaSc ...

  3. 关于Unicode,字符集,字符编码,每个程序员都应该知道的事

    关于Unicode,字符集,字符编码,每个程序员都应该知道的事 作者:Jack47 李笑来的文章如何判断一个人是否聪明?中提到: 必要.清晰.且准确的概念,是一切思考的基石.所谓思考,很大程度上,就是 ...

  4. 【vs调试】PDB 文件:每个开发人员都必须知道的

    [vs调试]PDB文件:每个开发人员都必须知道的 GDB:The GNU Project Debugger, 将会包含代码中符号(自定义变量, 数据类型), 还有函数调用或类引用的关联性, 有了pdb ...

  5. PDB文件:每个开发人员都必须知道的

    PDB Files: What Every Developer Must Knowhttp://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05 ...

  6. 每个JavaScript程序员都需要知道的5个数组方法

    Array.forEach() .forEach() 方法能够方便的让你 遍历数组里的每个元素,你可以在回调函数里对每个元素进行操作..forEach()方法没有返回值,你不需要在回调函数里写retu ...

  7. 每个php程序员都应该知道的15个最佳PHP库

    PHP是一种功能强大的web站点脚本语言,通过PHP,web网站开发者可以更容易地创建动态的引人入胜的web页面.开发人员可以使用PHP代码与一些网站模板和框架来提升功能和特性.然而,编写PHP代码是 ...

  8. 22个必须知道的css技巧

    1.改变选中文字的背景和颜色 ::selection{ /* Safari and Opera */ background:#c3effd; color:#000; } ::-moz-selectio ...

  9. (转)【推荐】初级.NET程序员,你必须知道的EF知识和经验

    转自:http://www.cnblogs.com/zhaopei/p/5721789.html [推荐]初级.NET程序员,你必须知道的EF知识和经验   阅读目录   [本文已下咒.先顶后看,会涨 ...

随机推荐

  1. hdu 3709 Balanced Number(数位dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题意:给定区间[a,b],求区间内平衡数的个数.所谓平衡数即有一位做平衡点,左右两边数字的力矩相 ...

  2. 在docker上编译openjdk8

    以前曾经试过在VMware上安装linux,再在linux上编译openjdk8,但是每次都不顺利,例如linux环境,预装依赖软件,openjdk源码的选择等环境都会遇到问题,一旦失败再重新开始挺费 ...

  3. 深入理解SQL Server数据库Select查询原理(一)

    使用SQL Server十年有余,但是一直对其Select查询机制原理一致不明,直到最近有个通讯录表,很简单的一张表(但因简单,所以当时并没有考虑按部门排序问题),结果想查询某个单位所有部门(不重复) ...

  4. jsp页面直接输出了html代码

    可能出现的情况: 1.修改web.xml中springMVC的过滤器路径如下: "/"与"/*区别" 其实/和/*都可以匹配所有的请求资源,但其匹配的优先顺序是 ...

  5. length属性、length()方法和size()的方法的区别

    JAVA 1. length属性是针对Java中的数组来说的,要求数组的长度可以用其length属性: 2.length()方法是针对字符串来说的,要求一个字符串的长度就要用到它的length()方法 ...

  6. 字节输出流OutputStream

    1.OutputStream是输出字节流的超类. import java.io.File; import java.io.FileOutputStream; import java.io.IOExce ...

  7. charles 高亮Hosts

    本文参考:charles 高亮Hosts Focus Host是焦点域名的:这里配置好的可以在结构视图中,单独拎出来显示: 如下图,在把zhubangbang.com设为焦点域名,在视图中是下图这么展 ...

  8. 16 (OC)* UIAnimation和CoreAnimation

    目录 一 Core Animation 二 核心动画 2.1 基础动画 2.2 关键帧动画 2.3 动画组 2.4 转场动画 2.5 逐帧动画 三 UIView动画封装 3.1 基础动画 3.2 弹簧 ...

  9. 05 (OC) 二叉树 深度优先遍历和广度优先遍历

    总结深度优先与广度优先的区别   1.区别 1) 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列. 2) 深度优先遍历:对每一个可能的分支路径深入到不能再深入 ...

  10. Android 让你的 Room 搭上 RxJava 的顺风车 从重复的代码中解脱出来

    # 什么是 Room ? 谷歌为了帮助开发者解决 Android 架构设计问题,在 Google I/O 2017 发布一套帮助开发者解决 Android 架构设计的方案:Android Archit ...