10个Python小技巧你值得拥有

列表推导式

你有一个list: bag = [1, 2, 3, 4, 5]

现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6, 8, 10]

大多初学者,根据之前语言的经验会大概这样来做

bag = [1, 2, 3, 4, 5]
for i in range(len(bag)):
 bag[i] = bag[i] * 2

但是有更好的方法:

bag = [elem * 2 for elem in bag]

很简洁对不对?这叫做Python的列表推导式 。

遍历列表

还是上面的列表。如果可能尽量避免这样做:

bag = [1, 2, 3, 4, 5]
for i in range(len(bag)):
 print(bag[i])

取而代之的应该是这样:

bag = [1, 2, 3, 4, 5]
for i in bag:
 print(i)

如果 x 是一个列表,你可以对它的元素进行迭代。多数情况下你不需要各元素的索引,但如果你非要这样做,那就用 enumerate 函数。它像下边的样子:

bag = [1, 2, 3, 4, 5]
for index, element in enumerate(bag):
 print(index, element)

非常直观明了。

元素互换

如果你是从java或者C语言转到Python来,可能会习惯于这样:

a = 5
b = 10
# 交换 a 和 b
tmp = a
a = b
b = tmp

但Python提供了一个更自然更好的方法!

a = 5
b = 10
# 交换a 和 b
a, b = b, a

初始化列表

假如你要一个是10个整数0的列表,你可能首先想到:

bag = []
for _ in range(10):
 bag.append(0)

换个方式吧:

bag = [0] * 10

看,多优雅。

注意:如果你列表包含了列表,这样做会产生浅拷贝。

举个例子:

bag_of_bags = [[0]] * 5 # [[0], [0], [0], [0], [0]]
bag_of_bags[0][0] = 1 # [[1], [1], [1], [1], [1]]

Oops!所有的列表都改变了,而我们只是想要改变第一个列表。

改一改啦:

bag_of_bags = [[0] for _ in range(5)]
# [[0], [0], [0], [0], [0]]
bag_of_bags[0][0] = 1
# [[1], [0], [0], [0], [0]]

“过早优化是万恶之源”问问自己,初始化一个列表是必须的吗?

构造字符串

你会经常需要打印字符串。要是有很多变量,避免下面这样:

name = "Raymond"
age = 22
born_in = "Oakland, CA"
string = "Hello my name is " + name + "and I'm " + str(age) + " years old. I was born in " + born_in + "."
print(string)

额,这看起来多乱呀?你可以用个漂亮简洁的方法来代替, .format 。

这样做:

name = "Raymond"
age = 22
born_in = "Oakland, CA"
string = "Hello my name is {0} and I'm {1} years old. I was born in {2}.".format(name, age, born_in)
print(string)

返回tuple元组

Python允许你在一个函数中返回多个元素,这让生活更简单。但是在解包元组的时候出出线这样的常见错误:

def binary(): return 0, 1
result = binary()
zero = result[0]
one = result[1]

这是没必要的,你完全可以换成这样:

def binary(): return 0, 1
zero, one = binary()

要是你需要所有的元素被返回,用个下划线 _ :

zero, _ = binary()

就是这么高效率!

访问Dict字典

你也会经常给 dicts 中写入 key,value (键,值)。

如果你试图访问一个不存在的于 dict 的 key ,可能会为了避免 KeyError 错误,你会倾向于这样做:

countr = {}
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7]
for i in bag:
 if i in countr:
 countr[i] += 1 else:
 countr[i] = 1
for i in range(10):
 if i in countr:
print("Count of {}: {}".format(i, countr[i]))
else:
print("Count of {}: {}".format(i, 0))

但是,用 get() 是个更好的办法。

countr = {}
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7]
for i in bag:
 countr[i] = countr.get(i, 0) + 1
for i in range(10):
 print("Count of {}: {}".format(i, countr.get(i, 0)))

当然你也可以用 setdefault 来代替。

这还用一个更简单却多费点开销的办法:

bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7]
# {2: 3, 3: 1, 1: 1, 5: 1, 6: 1, 7: 2, 9: 1}
countr = dict([(num, bag.count(num)) for num in bag])
for i in range(10):
 print("Count of {}: {}".format(i, countr.get(i, 0)))

你也可以用 dict 推导式。

countr = {num: bag.count(num) for num in bag}

这两种方法开销大是因为它们在每次 count 被调用时都会对列表遍历。

使用库

现有的库只需导入你就可以做你真正想做的了。

还是说前面的例子,我们建一个函数来数一个数字在列表中出现的次数。那么,已经有一个库就可以做这样的事情。

from collections import Counter
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7]
countr = Counter(bag)for i in range(10):
 print("Count of {}: {}".format(i, countr[i]))

一些用库的理由:

•代码是正确而且经过测试的。
•它们的算法可能会是最优的,这样就跑的更快。
•抽象化:它们指向明确而且文档友好,你可以专注于那些还没有被实现的。
•最后,它都已经在那儿了,你不用再造轮子了。
•在列表中切片/步进

你可以指定 start 的点和 stop 点,就像这样 list[start:stop:step] 。我们取出列表中的前5个元素:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for elem in bag[:5]:
 print(elem)

这就是切片,我们指定 stop 点是5,再停止前就会从列表中取出5个元素。

要是最后5个元素怎么做?

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for elem in bag[-5:]:
 print(elem)

没看明白吗? -5 意味着从列表的结尾取出5个元素。

如果你想对列表中元素间隔操作,你可能会这样做:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for index, elem in enumerate(bag):
 if index % 2 == 0:
print(elem)

但是你应该这样来做:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for elem in bag[::2]:
 print(elem)
# 或者用 ranges
bag = list(range(0,10,2))
print(bag)

这就是列表中的步进。 list[::2] 意思是遍历列表同时两步取出一个元素。

你可以用 list[::-1] 很酷的翻转列表。

tab键还是空格

长时间来看,将tab和空格混在一起会带来很多不必要的麻烦,你会看到 IndentationError: unexpected indent 。不管你选择tab键还是空格键,你应该在你的文件和项目中一直保持使用。

一个使用空格而不是tab的原因是,tab不是在所有编辑器中都一样的。视呢所用的编辑器,tab可能会被当作2到8个空格。

你也可以在写代码时用空格来定义tab。这样你可以自己选择用几个空格来当做tab。大多数Python用户是用4个空格。

总结

以上所述是小编给大家介绍的10个Python小技巧你值得拥有,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 一行代码让 Python 的运行速度提高100倍

    python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差. "一行代码让python的运行速度提高100倍"这绝不是哗众取宠的论调. 我们来看一下这个最简单的例子,从1一直累加到1亿. 最原始的代码: import time def foo(x,y): tt = time.time() s = 0 for i in range(x,y): s += i print('Time used: {} sec'.form

  • 3个用于数据科学的顶级Python库

    Python有许多吸引力,如效率,代码可读性和速度,使其成为数据科学爱好者的首选编程语言.Python通常是希望升级其应用程序功能的数据科学家和机器学习专家的首选. 由于其广泛的用途,Python拥有大量的库,使数据科学家可以更轻松地完成复杂的任务,而无需很多编写代码的麻烦.以下是数据科学的前3个Python库. 使用这些库将Python转化为一个科学的数据分析和建模工具. 1.NumPy NumPy(Numerical Python的缩写)是配备有用资源的顶级库之一,可帮助数据科学家将Pyth

  • 使用EduBlock轻松学习Python编程

    如果你正在寻找一种方法将你的学生(或你自己)从使用 Scratch 编程转移到学习 Python,我建议你了解一下 EduBlocks.它为 Python 3 编程带来了熟悉的拖放式图形用户界面(GUI). 从 Scratch 过渡到 Python 的一个障碍是缺少拖放式 GUI,而正是这种拖放式 GUI 使得 Scratch 成为 K-12 学校的应用程序.EduBlocks 的拖放版的 Python 3 改变了这种范式.它的目的是"帮助教师在较早的时候向儿童介绍基于文本的编程语言,如 Pyt

  • Python线程同步的实现代码

    本文介绍Python中的线程同步对象,主要涉及 thread 和 threading 模块. threading 模块提供的线程同步原语包括:Lock.RLock.Condition.Event.Semaphore等对象. 线程执行 join与setDaemon 子线程在主线程运行结束后,会继续执行完,如果给子线程设置为守护线程(setDaemon=True),主线程运行结束子线程即结束: 如果join()线程,那么主线程会等待子线程执行完再执行. import threading import

  • Python中GIL的使用详解

    1.GIL简介 GIL的全称为Global Interpreter Lock,全局解释器锁. 1.1 GIL设计理念与限制 python的代码执行由python虚拟机(也叫解释器主循环,CPython版本)来控制,python在设计之初就考虑到在解释器的主循环中,同时只有一个线程在运行.即在任意时刻只有一个线程在解释器中运行.对python虚拟机访问的控制由全局解释锁GIL控制,正是这个锁来控制同一时刻只有一个线程能够运行. 在调用外部代码(如C.C++扩展函数)的时候,GIL将会被锁定,直到这

  • Python 使用类写装饰器的小技巧

    最近学到了一个有趣的装饰器写法,就记录一下. 装饰器是一个返回函数的函数.写一个装饰器,除了最常见的在函数中定义函数以外,Python还允许使用类来定义一个装饰器. 1.用类写装饰器 下面用常见的写法实现了一个缓存装饰器. def cache(func): data = {} def wrapper(*args, **kwargs): key = f'{func.__name__}-{str(args)}-{str(kwargs)})' if key in data: result = data

  • Python中的函数式编程:不可变的数据结构

    让我们首先考虑正方形和长方形.如果我们认为在接口方面,忽略了实现细节,方块是否是矩形的子类型? 子类型的定义取决于Liskov代换原理.为了成为一个子类型,它必须能够完成超级类型所做的一切. 如何定义矩形的接口? zope.interface import Interface class IRectangleInterface: get_length: """Squares can do that""" get_width: "&quo

  • Python实现App自动签到领取积分功能

    要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化.但是发现食行没有页面,只有 APP,这不是一个好消息,这意味着需要抓包处理了. 下面的操作就好办了,在电脑端的浏览器打开网址,按下 F12,开始起飞~ 登录分析 点击签到后,会跳转到用户登录页面: https://wechatx.34580.com/mart/#/sign/in,输入登录信息后,点击登录,同时关注开发调试栏的网络交互信息 . 可以发现,登录的请求地址是: https://wechatx.34580.com/s

  • 面向初学者的Python编辑器Mu

    Meet Mu,一个开放源码编辑器,使学生们更容易学习编写Python代码. Mu一个开源编辑器,是满足学生可以轻松学习编写Python代码的工具.作为初学程序员的Python编辑器,旨在使学习体验更加愉快.它使学生​​能够在早期体验Python的编程,而这对于初学者学习新知识的很重要. 如果你曾试图教年轻人如何编程,你会立即掌握Mu的重要性.大多数编程工具都是由开发人员为开发人员编写的,并不适合初学程序员,无论他们的年龄如何.然而,Mu是由老师为学生而设计的工具. Mu是由Nicholas T

  • 10个Python小技巧你值得拥有

    列表推导式 你有一个list: bag = [1, 2, 3, 4, 5] 现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6, 8, 10] 大多初学者,根据之前语言的经验会大概这样来做 bag = [1, 2, 3, 4, 5] for i in range(len(bag)): bag[i] = bag[i] * 2 但是有更好的方法: bag = [elem * 2 for elem in bag] 很简洁对不对?这叫做Python的列表推导式 . 遍历列表 还是上面的列表

  • 3分钟学会一个Python小技巧

    Python时间日期转换在开发中是非常高频的一个操作,你经常会遇到需要将字符串转换成 datetime 或者是反过来将 datetime 转换成字符串. datetime 分别提供了两个方法 strptime 和 strftime ,但是我们老是被这两个方法搞混,不知道哪个是字符串转 datetime,哪个是 datetime 转字符串,每次都要去百度 Google 一下,或者跑去查个文档. 其实,这两个方法可以稍微用点技巧把这两个方法记住,而且是永远的记住. strptime strptime

  • 经验丰富程序员才知道的15种高级Python小技巧(收藏)

    目录 1.通过多个键值将对象进行排序 2.数据类别 3.列表推导 4.检查对象的内存使用情况 5.查找最频繁出现的值 6.属性包 7.合并字典(Python3.5+) 8.返回多个值 9.列表元素的过滤 filter()的使用 10.修改列表 11.利用zip()来组合列表 12.颠倒列表 13.检查列表中元素的存在情况 14.展平嵌套列表 15.检查唯一性 1.通过多个键值将对象进行排序 假设要对以下字典列表进行排序: people = [ { 'name': 'John', "age&quo

  • 最实用的20个python小技巧

    目录 1.用itertools排列 2.单行条件表达式 3. 反转字符串 4. 使用 Assert 处理异常  5. 对多个输入使用拆分 6. 用 zip() 转置矩阵 7. 资源上下文管理器 8. 下划线作为分隔符 9. 尝试 f 字符串格式 10.用这个技巧交换整数 11. 使用 lambda 代替函数 12.多次打印无循环  13. 将字符串解包为变量 14. 使用 Map 进行列表理解 15. 从列表中删除重复项 16. 打印语句中的条件  17. 条件列表 All 和 Any 18.

  • Python小技巧练习分享

    目录 1.反转数字 2.类的说明文档 3.设置 Python 文件的编码 4.旋转字符串 5.实现控制台滚动条 6.print 函数直接写入文件 7.合并 2 个列表 1.反转数字 问题场景: 把数字 789 转换为 987. 典型的数字翻转问题. 解决思路: 将数字的百位十位个位拆解出来,就解开了 编码如下: def reverse_number(number): baiwei = int(number/100) shiwei = int(number%100/10) gewei = int(

  • 分享一些非常实用的Python小技巧

    目录 1.唯一性 2.变位词(相同字母异序词) 3.内存 4.字节大小 5.打印N次字符串 6.首字母大写 7.列表细分 8.压缩 9.计数 10.链式比较 11.逗号分隔 12.元音计数 13.首字母小写 14.展开列表 15.寻找差异 16.输出差异 17.链式函数调用 18. 19.将两个列表转换为字库 20.出现频率最高的元素 21.回文(正反读有一样的字符串) 22.不用if-else语句的计算器 23.随机排序 24.展开列表 1.唯一性 以下方法可以检查给定列表是否有重复的地方,可

  • python小技巧——将变量保存在本地及读取

    在用jupyter notebook写python代码的过程中会产生很多变量,而关闭后或者restart jupyter kernel后所有变量均会消失,想要查看变量就必须将代码重新再运行一遍,而想在另一个jupyter notebook中调用变量就更加麻烦.在运行时间很长的代码中将变量保存下来能够节省很多事. 那就开始吧! 我用到的包是pickle 1.在使用之前首先需要导入包: import pickle 2.导入包后即可开始实质性操作,我们定义保存变量和读取变量的函数. 保存变量函数: d

  • 17个Python小技巧分享

    1.交换变量 复制代码 代码如下: x = 6 y = 5 x, y = y, x print x >>> 5 print y >>> 6 2.if 语句在行内 复制代码 代码如下: print "Hello" if True else "World" >>> Hello 3.连接 下面的最后一种方式在绑定两个不同类型的对象时显得很酷. 复制代码 代码如下: nfc = ["Packers",

  • JavaScript编程的10个实用小技巧

    在这篇文章中,我将列出10个Javascript实用小技巧,主要面向Javascript新手和中级开发者.希望每个读者都能至少从中学到一个有用的技巧. 1.变量转换 看起来很简单,但据我所看到的,使用构造函数,像Array()或者Number()来进行变量转换是常用的做法.始终使用原始数据类型(有时也称为字面量)来转换变量,这种没有任何额外的影响的做法反而效率更高. 复制代码 代码如下: var myVar   = "3.14159",str     = ""+ m

  • 使用Python解决Windows文件名非用反斜杠问题(python 小技巧)

    在编程过程中,我们往往会遇到一个小麻烦--微软 Windows 系统在文件夹名之间使用反斜杠字符,而几乎所有其它的计算机(操作系统)都使用正斜杠: Windows filenames: C:\some_folder\some_file.txt Most other operating systems: /some_folder/some_file.txt 这是由于上世纪 80 年代早期计算机历史上的一个小意外.「MS-DOS」的第一版使用了正斜杠字符来指定命令行选项.当微软在「MS-DOS 2.

随机推荐