编辑:数据分析1480
作者:地球的外星人君
来源:知乎
1. 枚举 - enumerate 可以有参数哦
之前我们这样操作:
i = 0
for item in iterable:
print i, item
i += 1
现在我们这样操作:
for i, item in enumerate(iterable):
print i, item
enumerate函数还可以接收第二个参数。就像下面这样:
>>> list(enumerate('abc'))
[(0, 'a'), (1, 'b'), (2, 'c')]
>>> list(enumerate('abc', 1))
[(1, 'a'), (2, 'b'), (3, 'c')]
2. 字典/集合 解析
你也许知道如何进行列表解析,但是可能不知道字典/集合解析。它们简单易用且高效。就像下面这个例子:
my_dict = {i: i * i for i in xrange(100)}
my_set = {i * 15 for i in xrange(100)}
# There is only a difference of ':' in both
# 两者的区别在于字典推导中有冒号
3. 强制浮点除法
from __future__ import division
result = 1/2
# print(result)
# 0.5
4. 对Python表达式求值
我们都知道eval函数,但是我们知道literal_eval函数么?也许很多人都不知道吧。可以用这种操作:
import ast
my_list = ast.literal_eval(expr)
来代替以下这种操作:
expr = "[1, 2, 3]"
my_list = eval(expr)
我相信对于大多数人来说这种形式是第一次看见,但是实际上这个在Python中已经存在很长时间了。
5. 字符串/数列 逆序
你可以用以下方法快速逆序排列数列:
>>> a = [1,2,3,4]
>>> a[::-1]
[4, 3, 2, 1]
# This creates a new reversed list.
# If you want to reverse a list in place you can do:
a.reverse()
这种方式也同样适用于字符串的逆序:
>>> foo = "yasoob"
>>> foo[::-1]
'boosay'
6. 三元运算
三元运算是if-else 语句的快捷操作,也被称为条件运算。这里有几个例子可以供你参考,它们可以让你的代码更加紧凑,更加美观。
[on_true] if [expression] else [on_false]
x, y = 50, 25
small = x if x < y else y
7. Python里面如何拷贝一个对象
标准库中的copy模块提供了两个方法来实现拷贝.一个方法是copy,它返回和参数包含内容一样的对象.
import copy
new_list = copy.copy(existing_list)
有些时候,你希望对象中的属性也被复制,可以使用deepcopy方法:
import copy
new_list_of_dicts = copy.deepcopy(existing_list_of_dicts)
copy(x)
Shallow copy operation on arbitrary Python objects.
deepcopy(x, memo=None, _nil=[])
Deep copy operation>
8. python中如何判断对象相等
首先是C#中字符串的==和equal方法。
“==” :
对于内置值类型而言, == 判断两个内存值是否相等。
对于用户自定义的值类型而言(Struct), == 需要重载,否则不能使用。
对于引用类型而言,默认是同一引用才返回true,但是系统重载了很多引用类型的 == (比如下文提到的string),所以c#中引用类型的比较并不建议使用 ==。
“equals” :
对于值类型而言, 内存相等才返回true。
对于引用类型而言,指向同一个引用才算相等。
但是比较特殊的是字符串String,是一个特殊的引用型类型,在C#语言中,重载了string的equals()方法,使string对象用起来就像是值类型一样。
python中的 ==
python中的对象包含三要素:id, type, value
id 用来标识唯一一个对象,type标识对象的类型,value用来设置对象的值。
is 判断是否是一个对象,使用id来判断的。
== 是判断a对象的值是否是b对象的值,默认调用它的__eq__方法。
9. 命名技巧
今天阅读代码,发现一个不错的函数命名方式:
def request(_argv):
就是把所有的参数前面都加上_下划线,这样你在函数体中,一眼就可以看出那些是局部变量,那些是作为参数传入的,类似把全局变量前面加上g。
10. 开发者工具集锦