lovecn / lovecn.github.io

个人记录
5 stars 5 forks source link

python入门 #22

Open lovecn opened 9 years ago

lovecn commented 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的编码格式
lovecn commented 9 years ago

http://docs.quantifiedcode.com/python-anti-patterns/

lovecn commented 9 years ago

http://www.zhihu.com/question/25457573

lovecn commented 9 years ago

http://limodou.github.io/uliweb-doc/zh_CN/index.html http://pan.baidu.com/share/link?shareid=3130751943&uk=889513934

lovecn commented 9 years ago

https://www.pythonanywhere.com/try-ipython/ 输入 !bash 后可以进入shell

lovecn commented 9 years ago

http://www.pythontutor.com/ https://github.com/ipython/ipython

lovecn commented 9 years ago

http://repl.it/ https://github.com/replit/empythoned http://repl.it/languages 列出了支持的语言列表

lovecn commented 9 years ago

http://stackoverflow.com/questions/1504717/why-does-comparing-strings-in-python-using-either-or-is-sometimes-produce == vs is

lovecn commented 9 years ago

python 编码 http://www.pulpcode.cn/program-language/2014/12/23/python-encode/