[关闭]
@happyfans 2015-09-08T10:33:01.000000Z 字数 6216 阅读 1688

python

python


一个基本的hello world程序

  1. #!/usr/bin/env python
  2. #-*- coding:utf-8 -*-
  3. # Filename : hello.py
  4. print 'Hello World'

如果选择pep8风格的python代码风格,linux下有个方便的代码检查工具:

  1. apt-get update apt-get install pep8
  2. pep8 hello.py

如果执行pep8命令没有错误信息,则证明python代码符合pep8风格。

python流程控制

选择

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Filename : guess.py
  4. true_num = 88
  5. guess_num = int(raw_input(unicode('请输入数字','utf-8').encode('gbk')))
  6. if guess_num > true_num:
  7. print u'错误!你输入的数字过大'
  8. elif guess_num < true_num:
  9. print u'错误!你输入的数字过小'
  10. else:
  11. print u'不可思议,你猜对了'
  12. print u'游戏结束!:)'

循环

  1. a = ['cat','window','hello']
  2. for x in a:
  3. print x,len(x)

运行结果:

  1. cat 3
  2. window 6
  3. hello 5

range(start,end,step)函数(同java一样是左闭右开区间)

  1. print range(10)
  2. print range(5,10)
  3. print range(-1,10,2)

运行结果

  1. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  2. [5, 6, 7, 8, 9]
  3. [-1, 1, 3, 5, 7, 9]

通过range()和len()迭代序列

  1. a = ['Marry','had','a','little','lamp']
  2. for i in range(len(a)):
  3. print i,a[i]

运行结果

  1. 0 Marry
  2. 1 had
  3. 2 a
  4. 3 little
  5. 4 lamp

pass语句
pass 语句用于那些语法上必须要有什么语句,但程序什么也不做的场合。

  1. while True:
  2. pass # 阻塞键盘输入(Ctrl + C)

用于创建最小结构的类.

  1. class MyEmptyClass:
  2. pass

python中的函数

定义函数

  1. def fib(n):
  2. a,b = 0,1
  3. while a < n:
  4. print a,
  5. a,b = b,a+b
  6. fib(2000)

result:

  1. 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

默认参数

  1. def ask_ok(prompt,retries=4,complaint='Yes or no,please!'):
  2. while True:
  3. ok = raw_input(prompt)
  4. if ok in ('y','yes'):
  5. return True
  6. if ok in ('n','no'):
  7. return False
  8. retries = retries - 1
  9. if retries < 0:
  10. raise IOError('refusenik user')
  11. print complaint

我们可以这样进行调用:

  1. ask_ok('1真的要退出么?')
  2. ask_ok('2真的要退出么?',2)
  3. ask_ok('3真的要退出么?',2,'只能输入yes或者no')

注意:默认值只能被赋值一次。

  1. a = 5
  2. def fun(arg=a):
  3. print arg
  4. fun() # 输出5
  5. a = 100
  6. fun() # 还是输出5

关键字参数(形如key=value)

  1. def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
  2. print "-- This parrot wouldn't", action,
  3. print "if you put", voltage, "volts through it."
  4. print "-- Lovely plumage, the", type
  5. print "-- It's", state, "!"
  6. parrot(1000) # 1 positional argument
  7. parrot(voltage=1000) # 1 keyword argument
  8. parrot(voltage=1000000, action='VOOOOOM') # 2 keyword arguments
  9. parrot(action='VOOOOOM', voltage=1000000) # 2 keyword arguments
  10. parrot('a million', 'bereft of life', 'jump') # 3 positional arguments
  11. parrot('a thousand', state='pushing up the daisies') # 1 positional, 1 keyword

可变参

  1. def test(*args):
  2. print args
  3. test(1,2,3)

result:

  1. (1, 2, 3)

lambda表达式

  1. def make_incrementor(n):
  2. return lambda x: x + n
  3. f = make_incrementor(42)
  4. f(0) # 42
  5. f(1) # 43

通过lambda可以创建更小的匿名函数

  1. tmp = lambda x:x + 1
  2. type(tmp) # <type 'function'>
  3. tmp(10) # 11

数据结构

列表

可以用[]或者list()来创建,元素可变。

列表对象的方法

  1. list = [1,2,3]
  2. l = [4,5,6]
  3. list.append(l)
  4. list # 结果是[1, 2, 3, [4, 5, 6]]
  5. list.extend(l)
  6. list # 结果是[1, 2, 3, [4, 5, 6], 4, 5, 6]

用列表模拟堆栈

堆栈是一种LIFO的数据结构。我们知道append()方法将元素添加到列表的末尾,而不带参的pop()方法每次取末尾的元素。

  1. stack = [] # 置空栈
  2. stack.append(1) # 入栈
  3. stack.append(2)
  4. stack.append(3)
  5. stack # [1, 2, 3]
  6. stack.pop() # 出栈 3
  7. stack.pop() # 2
  8. stack.pop() # 1

使用列表模拟队列

队列是一种FIFO的数据结构。同理,我们使用append()方法每次向列表的尾部添加数据,每次使用pop(0)方法取出第一个元素。不过这样的队列效率很低,因为从列表末尾添加和弹出很快(为了一个元素,要移动整个列表中的所有元素),高性能的队列可以参照collections.deque它为在首尾两端快速插入和删除而设计。例如:

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Filename : deque.py
  4. from collections import deque
  5. queue = deque([1,2,3])
  6. queue.append(4)
  7. queue.append(5) # 入队列
  8. print queue
  9. x = queue.popleft() # 出队列
  10. print x
  11. print queue
  12. x = queue.popleft() # 出队列
  13. print x
  14. print queue
  15. x = queue.pop()
  16. print x
  17. print queue

函数式编程工具

对于列表来讲,有三个内置函数非常有用:
- filter(function, sequence)返回一个sequence(序列)。包括了给定序列中所有调用function(item)后返回值为true的元素。(如果可能的话,会返回相同的类型)。如果该 序列 (sequence) 是一个 string (字符串)或者 tuple (元组),返回值必定是同一类型,否则,它总是list。例如,以下程序可以计算0~9之间的偶数:

  1. def f(x):
  2. return x % 2 == 0
  3. print filter(f,range(10)) # [0, 2, 4, 6, 8]
  1. def cube(x):return x * x *x
  2. map(cube,range(5)) # [0, 1, 8, 27, 64]
  1. def add(x,y):return x+y
  2. reduce(add,range(1,11)) # 55

如果序列中只有一个元素,就返回它,如果序列是空的,就抛出一个异常。 可以传入第三个参数做为初始值。如果序列是空的,就返回初始值,否则函数会先接收初始值和序列的第一个元素,然后是返回值和下一个元素,依此类推.

  1. def sum(seq):
  2. def add(x,y):return x + y
  3. return reduce(add,seq,0)
  4. sum(range(1,11)) # 55
  5. sum([]) # 0

del语句

按照指定索引删除子项,不同于有返回值的pop()方法。语句del还可以从列表中删除切片或清空整个列表。

  1. >>> a = [-1, 1, 66.25, 333, 333, 1234.5]
  2. >>> del a[0]
  3. >>> a
  4. [1, 66.25, 333, 333, 1234.5]
  5. >>> del a[2:4]
  6. >>> a
  7. [1, 66.25, 1234.5]
  8. >>> del a[:]
  9. >>> a
  10. []

del也可以用来删除一个变量的定义del a,此后再引用命名 a 会引发错误(直到另一个值赋给它为止).

元组

()或者tuple()来创建,元素只读。元组有数个逗号分隔的值组成:

  1. >>> t = 12345, 54321, 'hello!'
  2. >>> t[0]
  3. 12345
  4. >>> t
  5. (12345, 54321, 'hello!')
  6. >>> # Tuples may be nested:
  7. ... u = t, (1, 2, 3, 4, 5)
  8. >>> u
  9. ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
  10. >>> # Tuples are immutable:
  11. ... t[0] = 88888
  12. Traceback (most recent call last):
  13. File "<stdin>", line 1, in <module>
  14. TypeError: 'tuple' object does not support item assignment
  15. >>> # but they can contain mutable objects:
  16. ... v = ([1, 2, 3], [3, 2, 1])
  17. >>> v
  18. ([1, 2, 3], [3, 2, 1])

元组在输出时总是有括号的,以便于正确表达嵌套结构。在输入时可以有或没有括号,不过经常括号都是必须的(如果元组是一个更大的表达式的一部分).
元组有很多用途。例如(x, y)坐标对,数据库中的员工记录等等。元组就像字符串,不可改变。 一个特殊的问题是构造包含零个或一个元素的元组:为了适应这种情况,语法上有一些额外的改变。一对空的括号可以创建空元组;要创建一个单元素元组可以在值后面跟一个逗号(在括号中放入一个单值不够明确)。丑陋,但是有效.

  1. >>> empty = ()
  2. >>> singleton = 'hello', # <-- note trailing comma
  3. >>> len(empty)
  4. 0
  5. >>> len(singleton)
  6. 1
  7. >>> singleton
  8. ('hello',)

集合

{}或者set()来创建,元素不可重复。

  1. >>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
  2. >>> fruit = set(basket) # create a set without duplicates
  3. >>> fruit
  4. set(['orange', 'pear', 'apple', 'banana'])
  5. >>> 'orange' in fruit # fast membership testing
  6. True
  7. >>> 'crabgrass' in fruit
  8. False
  9. >>> # Demonstrate set operations on unique letters from two words
  10. ...
  11. >>> a = set('abracadabra')
  12. >>> b = set('alacazam')
  13. >>> a # unique letters in a
  14. set(['a', 'r', 'b', 'c', 'd'])
  15. >>> a - b # letters in a but not in b
  16. set(['r', 'd', 'b'])
  17. >>> a | b # letters in either a or b
  18. set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
  19. >>> a & b # letters in both a and b
  20. set(['a', 'c'])
  21. >>> a ^ b # letters in a or b but not both
  22. set(['r', 'd', 'b', 'm', 'z', 'l'])

字典

{}或者dict()来创建,存放键值对。

  1. >>> tel = {'jack': 4098, 'sape': 4139}
  2. >>> tel['guido'] = 4127
  3. >>> tel
  4. {'sape': 4139, 'jack': 4098, 'guido': 4127}
  5. >>> tel['jack']
  6. 4098
  7. >>> del tel['sape']
  8. >>> tel['irv'] = 4127
  9. >>> tel
  10. {'guido': 4127, 'irv': 4127, 'jack': 4098}
  11. >>> tel.keys()
  12. ['guido', 'irv', 'jack']
  13. >>> 'guido' in tel
  14. True

dict() 构造函数可以直接从 key-value 对中创建字典:

  1. >>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
  2. {'sape': 4139, 'jack': 4098, 'guido': 4127}

字典推导式可以从任意的键值表达式中创建字典:

  1. >>> {x: x**2 for x in (2, 4, 6)}
  2. {2: 4, 4: 16, 6: 36}

如果关键字都是简单的字符串,有时通过关键字参数指定 key-value 对更为方便:

  1. >>> dict(sape=4139, guido=4127, jack=4098)
  2. {'sape': 4139, 'jack': 4098, 'guido': 4127}

del语句可以删除以上数据结构,其中的元素也可以删除变量。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注