Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

python入门 #22

Open
lovecn opened this issue Apr 20, 2015 · 8 comments
Open

python入门 #22

lovecn opened this issue Apr 20, 2015 · 8 comments

Comments

@lovecn
Copy link
Owner

lovecn commented Apr 20, 2015

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
Copy link
Owner Author

lovecn commented May 31, 2015

@lovecn
Copy link
Owner Author

lovecn commented May 31, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 11, 2015

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

@lovecn
Copy link
Owner Author

lovecn commented Jun 11, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 11, 2015

@lovecn
Copy link
Owner Author

lovecn commented Aug 8, 2015

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant