Open lovecn opened 9 years ago
1. Python程序是大小写敏感的,如果写错了大小写,程序会报错。 t = ('a', 'b', ['A', 'B']) t[2][0] = 'X' t[2][1] = 'Y' t ('a', 'b', ['X', 'Y']) raw_input()读取的内容永远以字符串的形式返回,把字符串和整数比较就不会得到期待的结果,必须先用int()把字符串转换为我们想要的整型: birth = int(raw_input('birth: ')) dict的key必须是不可变对象。 默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.itervalues(),如果要同时迭代key和value,可以用for k, v in d.iteritems()。 try: import json # python >= 2.6 except ImportError: import simplejson as json # python <= 2.5 2. >>> '-'.join(str(_) for _ in range(10)) '0-1-2-3-4-5-6-7-8-9' string.join只接受list of string see https://docs.python.org/2/library/string.html#string.join >>> '-'.join(['a','b',1]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: sequence item 2: expected string, int found sum = 0 for i in num_list: sum += i my_sum = sum(i for i in number_list) my_sum = reduce(lambda x, y: x+y, num_list) import operator; my_sum = reduce(operator.add, num_list) 汉字的编码中: \xe5\xae\x89\xe8\xa3\x85 这种形式是可能是 utf-8编码 u'\u5b89\u88c5' 这种形式的是 unicode 编码。 当你想在控制台看见他们汉字字面情况,直接 print 即可。无所谓转换不转换。如果不打印,编码都是和这差不多,都是一些字符。 当然,这两种是可以转换的 In [1]: s = '\xe5\xae\x89\xe8\xa3\x85' In [2]: print s 安装 In [3]: u = s.decode('utf-8') In [4]: u Out[4]: u'\u5b89\u88c5' In [5]: print u 安装 In [6]: ss = u.encode('utf-8') In [7]: ss Out[7]: '\xe5\xae\x89\xe8\xa3\x85' In [8]: ss == s Out[8]: True In [9]: type(s) Out[9]: str In [10]: type(u) Out[10]: unicode 通常情况下,Python2 内部的字符串有 str 和 unicode。当你要把字符写入文件中,例如一个txt或者html文件,现在的文件都习惯用utf-8编码。所以你需要把str转换成utf-8输出,那么到时候打开txt或者html才能看见中文,否则那时出现的才是乱码。 from pprint import pprint pprint(my_dict) 这用于字典打印是非常高效的,如果你想从文件中快速优雅的打印出json,可以这样做: cat file.json | python -m json.tools x, y = 50, 25 small = x if x < y else y 字符串/数列 逆序 >>> a = [1,2,3,4] >>> a[::-1] [4, 3, 2, 1] if n in [1,4,5,6]: 而不是用复杂的if结构: if n==1 or n==4 or n==5 or n==6: Enumerate可以接受第二个参数,例如: >>> list(enumerate('abc')) [(0, 'a'), (1, 'b'), (2, 'c')] >>> list(enumerate('abc', 1)) [(1, 'a'), (2, 'b'), (3, 'c')] 字典/集合 解析 my_dict = {i: i * i for i in xrange(100)} my_set = {i * 15 for i in xrange(100)} 分析脚本 python -m cProfile my_script.py Python表达式求值 import ast my_list = ast.literal_eval(expr) 而不是这样: expr = "[1, 2, 3]" my_list = eval(expr) import random print random.uniform(10, 20) print random.uniform(20, 10) #---- 结果(不同机器上的结果不一样) #18.7356606526 #12.5798298022 print random.randint(12, 20) #生成的随机数n: 12 <= n <= 20 print random.randint(20, 20) #结果永远是20 #print random.randint(20, 10) #该语句是错误的。下限必须小于上限。 random.randrange(10, 100, 2),结果相当于从[10, 12, 14, 16, ... 96, 98]序列中获取一个随机数。random.randrange(10, 100, 2)在结果上与 random.choice(range(10, 100, 2) 等效。 list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] slice = random.sample(list, 5) #从list中随机获取5个元素,作为一个片断返回 用于将一个列表中的元素打乱 p = ["Python", "is", "powerful", "simple", "and so on..."] random.shuffle(p) random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 从序列中获取一个随机元素 print random.choice("学习Python") print random.choice(["JGood", "is", "a", "handsome", "boy"]) print random.choice(("Tuple", "List", "Dict")) for index, cat in enumerate(cats): print(cat, index) >>> s = set() >>> s set() >>> s.add(1) >>> s {1} >>> s.add(2) >>> s {1, 2} >>> {}//空字典 {} re.match 尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词。 re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。 data = 'name = ~a+3' data1 = urllib.quote(data) print data1 # result: name%20%3D%20%7Ea%2B3 print urllib.unquote(data1) # result: name = ~a+3 data2 = urllib.quote_plus(data) print data2 # result: name+%3D+%7Ea%2B3 print urllib.unquote_plus(data2) # result: name = ~a+3 data3 = urllib.urlencode({ 'name': 'dark-bull', 'age': 200 }) print data3 # result: age=200&name=dark-bull data4 = urllib.pathname2url(r'd:/a/b/c/23.php') print data4 # result: ///D|/a/b/c/23.php print urllib.url2pathname(data4) # result: D:/a/b/c/23.php google = urllib.urlopen('http://www.google.com') print 'http header:/n', google.info() print 'http status:', google.getcode() print 'url:', google.geturl() for line in google: # 就像在操作本地文件 print line, google.close() t = ({'name': 'xiaoming', 'age': '11', 'hobby': 'play'}) 这不是一个tuple,其实等同于 t = {'name': 'xiaoming', 'age': '11', 'hobby': 'play'} 对于只有一个元素的,需要在后面跟上一个逗号(,) ==比较的是值 is比较的是引用,可以看作比较内存地址 id(a) vs id(b) python在实现整型中采用了这种方式,对于位于-5到256之间的数字,在内存中保留数组存储这些数字,下次使用时候直接引用。而在此范围外的数字,则会新建int对象。见以下示例: >>> a = 256 >>> b = 256 >>> a is b True >>> id(a) 9987148 >>> id(b) 9987148 >>> a = 257 >>> b = 257 >>> a is b False >>> id(a) 11662816 >>> id(b) 11662828 匹配中文 >>> import re >>> html = '<span class="pl">制片国家/地区:</span> 美国 / 澳大利亚<br/>' >>> re.findall(r'制片国家/地区:</span>(.*?)<br/>', html) [' \xe7\xbe\x8e\xe5\x9b\xbd / \xe6\xbe\xb3\xe5\xa4\xa7\xe5\x88\xa9\xe4\xba\x9a'] >>> re.findall(r'制片国家/地区:</span>(.*?)<br/>', html)[0] ' \xe7\xbe\x8e\xe5\x9b\xbd / \xe6\xbe\xb3\xe5\xa4\xa7\xe5\x88\xa9\xe4\xba\x9a' re.findall(ur'制片国家/地区:</span>(.*?)<br/>', html) Out[5]: [u' \u7f8e\u56fd / \u6fb3\u5927\u5229\u4e9a'] for x in range(101): print('fizz'[x%3*4:] + 'buzz'[x%5*4:] or x) 这两行要解决的问题是:在数字0-100里,遇到3的倍数输出fizz,遇到5的倍数输出buzz,遇到3和5的倍数输出fizzbuzz,其他的原样输出数字。 对于一个十进制数,如果其分母的所有因数都是质数且均小于10,那么它就能用一个有限小数来表示。例如1/4可以表示为0.25,1/10可以表示为0.1,1/20可以表示为0.05等等。 同理,对于一个二进制数,如果其分母的所有因数都是质数且均小于等于2,那么它就能用一个有限小数来表示。例如1/2可以表示为0.1,1/4可以表示为0.01,1/8可以表示为0.001,但是1/10就无法这样表示,只能表示为0.0001100110011... 如果说解决方法的话,推荐使用Decimal(),效果如下: >>> Decimal(32.343) Decimal('32.3430000000000035') >>> Decimal('32.343') Decimal('32.343') a = 1 # id(a) = 31341232 b = 1 # id(b) = 31341232 c = 1 # id(c) = 31341232 他们的id是一样的, [-5, 256]这些小对象由于使用频率高,python把他们缓存在内存中 但是一旦数字超过了256, e = 257 #id(e) = 40104988 f = 257 #id(f) = 40104940 1. # coding:utf-8 作用是定义源代码的编码. 如果没有定义, 此源码中是不可以包含中文字符串的. PEP 0263 -- Defining Python Source Code Encodings https://www.python.org/dev/peps/pep-0263/ 2. sys.getdefaultencoding() 是设置默认的string的编码格式
http://docs.quantifiedcode.com/python-anti-patterns/
http://www.zhihu.com/question/25457573
http://limodou.github.io/uliweb-doc/zh_CN/index.html http://pan.baidu.com/share/link?shareid=3130751943&uk=889513934
https://www.pythonanywhere.com/try-ipython/ 输入 !bash 后可以进入shell
http://www.pythontutor.com/ https://github.com/ipython/ipython
http://repl.it/ https://github.com/replit/empythoned http://repl.it/languages 列出了支持的语言列表
http://stackoverflow.com/questions/1504717/why-does-comparing-strings-in-python-using-either-or-is-sometimes-produce == vs is
python 编码 http://www.pulpcode.cn/program-language/2014/12/23/python-encode/