1. 输入和输出
#!/usr/bin/env python name = raw_input('please enter your name:') print 'hello,',name
2. 数据类型和变量
十进制:100 十六进制:0xff00 浮点数:3.14 科学计数:1.23e9 字符串:'abc' "xyz" 多行字符串: '''line1 ... line2 ... line3''' 布尔值:True False 逻辑运算符:and or not 空值:None
3. 字符串和编码
Unicode把所有语言都统一到一套编码里。
在内存里统一使用Unicode编码。
在传输和存储时,使用可变长编码UTF-8,从而节省空间和网络带宽。
4. Python对Unicode的支持
1. 最早的Python只支持ASCII编码。普通字符串'ABC'在Python内部都是ASCII编码的。Python提供了ord()和chr()函数,可以把字母和对应的数字相互转换。
>> ord('A') 65 >> chr(65) 'A'
2. Python后来添加了对Unicode的支持,以Unicode表示字符串用u'...'表示。
注意,u'中'和u'\u4e2d'是一样的。\u后面是十六进制的Unicode码。
>> print u'中文' 中文 >> u'中' u'\u4e2d' >>
3. Unicode编码转UTF-8编码
>> u'ABC'.encode('utf-8') 'ABC' >> u'中文'.encode('utf-8') '\xe4\xb8\xad\xe6\x96\x87' >>
使用len()可以返回字符串的长度
>> len(u'ABC') 3 >> len('ABC') 3 >> len(u'中文') 2 >> len('\xe4\xb8\xad\xe6\x96\x87') 6 >>
4. UTF-8编码转换为Unicode编码
>> 'abc'.decode('utf-8') u'abc' >> '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') u'\u4e2d\u6587' >> print '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') 中文 >>
5. 关于python的源文件保存
在保存源代码时,以UTF-8保存。
必须在源文件的头部声明UTF-8编码。#!/usr/bin/env python # -*- coding: utf-8 -*-
6. 格式化
注意,百分号使用两个百分号来表示
>> 'Hello, %s' % 'zhangsan' 'Hello, zhangsan' >> 'Hi, %s , you have $%d.' % ('Michael',1000) 'Hi, Michael , you have $1000.' >>
4. list有序列表
#创建一个list >> classmates = ['Michael','Bob','Tracy'] >> classmates ['Michael', 'Bob', 'Tracy'] #获取list元素个数 >> len(classmates) 3 #获取list里面第一个元素 >> classmates[0] 'Michael' #获取list里面最后一个元素 >> classmates[-1] 'Tracy' #追回一个元素到list的最后 >> classmates.append('Adam') >> classmates ['Michael', 'Bob', 'Tracy', 'Adam'] #插入一个元素到list的某个位置 >> classmates.insert(1,'Jack') >> classmates ['Michael', 'Jack', 'Bob', 'Tracy', 'Adam'] #弹出list的最后一个元素 >> classmates.pop() 'Adam' >> classmates ['Michael', 'Jack', 'Bob', 'Tracy'] #弹出list的第二个元素 >> classmates.pop(1) 'Jack' >> classmates ['Michael', 'Bob', 'Tracy'] >> classmates[1] = 'Sarah' >> classmates ['Michael', 'Sarah', 'Tracy'] >> L = ['Apple',123,True] #将列表L添加到list中 >> classmates.append(L) >> classmates ['Michael', 'Sarah', 'Tracy', ['Apple', 123, True]] #取出二维列表中的某个元素 >> classmates[-1][0] 'Apple' >>
5. tuple有序列表——元组(与list的区别是:tuple不可变)
和list完全一样,只是一旦定义,则不可变。
特别注意,定义只有一个元素的tuple时,必须加一个逗号(否则成了数据运算中的小括号)。>> t = (1,) >> t (1,) >>
6. 条件判断
#!/usr/bin/env python age = raw_input('please enter your age:\n') age = int(age) if age >= 18: print 'adult' elif age >= 6: print 'teenager' else: print 'kid'
简写
只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False。if x: print 'True'
7. 循环
1. for...in循环,依次把list或者tuple中的每个元素迭代出来
#!/usr/bin/env python names = [ 'Michael','Bob','Tracy'] for name in names: print name
2. range函数,生成整数序列
>> range(5) [0, 1, 2, 3, 4]
#!/usr/bin/env python sum = 0 for x in range(5): sum = sum + x print sum
3. while循环
#!/usr/bin/env python sum = 0 n = 10 while n > 0: sum = sum + n n = n - 2 print sum
4. 再议raw_input
将raw_input输入的字符串转为ini类型
#!/usr/bin/env python birth = int(raw_input('birth:\n')) birth
8. dict字典
#定义一个dict >> d = {'Michael':95,'Bob':75,'Tracy':85} #获取dict中的键值对 >> d['Michael'] 95 #添加键值对到dict中 >> d['Adam'] = 67 >> d {'Bob': 75, 'Michael': 95, 'Tracy': 85, 'Adam': 67} #判断某个键名是否在dict中存在 >> 'Thomas' in d False #获取dict中的某个键名的值,如果键名不存在,返回None >> d.get('Thomas') #获取dict中的某个键名的值,如果键名不存在,返回自定义的默认值 >> d.get('Thomas',-1) -1 #根据键名,删除dict中的某个键值对 >> d.pop('Bob') 75 >> d {'Michael': 95, 'Tracy': 85, 'Adam': 67} >>
9. set集合
创建set,需要提供一个list作为输入集合
set会自动过滤重复元素
两个set可以做数学意义上的交集、并集等操作>> s1 = set([1,2]) >> s1.add(3) >> s1 set([1, 2, 3]) >> s1.add(4) >> s1 set([1, 2, 3, 4]) >> s1.remove(4) >> s1 set([1, 2, 3]) >> s2 = set([2,3,4]) >> s2 set([2, 3, 4]) >> s1 & s2 set([2, 3]) >> s1 | s2 set([1, 2, 3, 4]) >>
10. 函数调用
>> help(abs) Help on built-in function abs in module __builtin__: abs(...) abs(number) -> number Return the absolute value of the argument. >> abs(-20) 20 >> cmp(1,2) -1 >> A = abs >> A(-1) 1 >>
11. 数据类型转换
>> int('123') 123 >> int(12.24) 12 >> float('12.34') 12.34 >> str(1.23) '1.23' >> unicode(100) u'100' >> bool(1) True >> bool('') False >> bool(0) False
12. 函数定义
注意,return None可以简写为return
#!/usr/bin/env python def my_abs(x): if x >= 0: return x else: return -x print my_abs(-100)
空函数
注意,pass为占位符#!/usr/bin/env python def nop(): pass nop()
参数检查isinstance
#!/usr/bin/env python def my_abs(x): if not isinstance(x,(int,float)): raise TypeError('bad operand type') if x >= 0: return x else: return -x print my_abs(-8)
返回多个值
返回多个值的本质其实是返回一个tuple
在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值。
所有Python的函数返回多值其实就是返回一个tuple#!/usr/bin/env python def move(x,y): nx = x + 10 ny = y + 20 return nx,ny x,y = move(100,200) print x,y
13. 函数的参数
1. 默认的参数
#!/usr/bin/env python def power(x,n=2): s = 1 while n > 0: n = n - 1 s = s * x return s print power(5) print power(3,3)
注意,默认参数必须指向不变对象。如None、字符串、数字。
下面是一个坑#!/usr/bin/env python def add_end(L=[]): L.append('END') return L print add_end() print add_end()
正确的写法是:
#!/usr/bin/env python def add_end(L=None): if L is None: L = [] L.append('END') return L print add_end() print add_end()
2. 可变参数
#!/usr/bin/env python def calc(*numbers): sum = 0 for n in numbers: sum = sum + n return sum print calc() print calc(1,2,3) nums = [1,2,3] print calc(*nums)
3. 关键字参数
#!/usr/bin/env python #定义关键字参数函数 def person(name,age,**kw): print 'name:',name,'age',age,'other',kw #调用关键字参数 person('Michael',30) person('Bob',35,city='Beijin') person('Adam',45,gender='M',job='Enginner') d = { 'city':'Beijin','job':'Enginner' } person('Jack',24,**d)
4.参数组合
各种类型的参数可以一起使用,但是参数定义的顺序必须是:
必先参数-默认参数-可变参数-关键字参数#!/usr/bin/env python def func(a,b,c=0,*args,**kw): print 'a =',a,'b =',b,'c =',c,'args =',args,'kw =',kw func(1,2) func(1,2,c=3) func(1,2,3,'a','b') func(1,2,3,'a','b',x=99) args = (1,2,3,4) kw = {'x':99 } func(*args,**kw)
14. 递归函数
注意,递归可能导致栈溢出
如果编译语言对尾递归进行了优化,无论怎么调用都不会栈溢出
遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有对尾递归做优化#!/usr/bin/env python #递归 def sum(n): if n==1: return 1 return n + sum(n-1) print sum(3) #尾递归 def func(n): return func_iter(n,1) def func_iter(num,product): if num == 1: return product return func_iter(num - 1,num + product) print func(3)