Python 快速预览

数据类型和变量

python 语言是动态语言

字符串和编码

  • UTF-8 是可变长编码,用来转化 Unicode 编码,UTF-8 一个 Unicode 字符根据不同的数字大小编码成 1-6 个字节。
  • 在 python 中,Unicode 表示的字符串用 u’…’表示.
  • 将 Unicode 字符转化为 UTF-8 字符用encode('utf-8'):
1
u'ABC'.encode('utf-8')
  • 将 UTF-8 字符转化为 Unicode 字符用decode('utf'):
1
'abc'.decode('utf-8')
  • 让 python 解释器按照 UTF-8 编码读取文件, 需要在文件开头写上如下:
    #-*- coding:utf-8 -*-
  • python 的格式化方法与 C 语言一致, 用 % 实现, 如:
1
2
3
4
'hello, %s' %'world'
hello, world
'Hi, %s, you have $%d.' %('Michael', 10000)
Hi, Michael, you have $1000.
  • 有几个 % 占位符, 后面就跟多少个变量, 顺序要对应好, 如果只有一个 %, 可省略括号.
    • 常见的占位符有,%d 整数, %f 浮点数,%s 字符串,%x 十六进制数.
    • 格式化整数和浮点数还可以指定是否补 0 和整数与小数的位数.
    • 在格式化字符串中, 需要转义 % 时, 可用 %% 表示.
  • 在 python 3.x 中,’xxxx’和 u’xxxx’ 统一成 Unicode 编码.

使用 list 和 tuple

list 的使用

list 里面的元素类型可以不同,也可以添加另外一个 list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classmates = ['Box', 'Ads'] # 创建 list 变量
classmates[0] # 访问 list 中的元素
output:'Box'
# 访问 list 最后一个元素
classmates[-1]
output: 'Ads'
# 添加元素到末尾
classmates.append('and')
# 插入元素到指定位置
classmates.insert(1, 'sdd')
# 删除末尾的元素
classmates.pop()
# 删除指定位置的元素
classmates.pop(i)
# 获得 list 的长度
len(classmates)

tuple

tuple 类似与 list,只是 tuple 一旦初始化就不可以修改。tuple 没有 append 和 insert 方法, 获得元素的方法与 list 一样。

1
2
3
4
# 创建一个 tuple
classmates= (1,2,3)
# 需要注意的是,当创建只有一个元素的 tuple 时,需要这样作来消除歧义:
classmates = (1,)

tuple 可以包含 list 元素,tuple 所包含的 list 元素中的元素内容可以更改。

dict

dict 类似与其他编程语言中的 map

1
2
3
4
5
6
7
8
# 创建一个 dict
d={'misc':93,'sds':82}
# 还可以通过 key 来放入 value:
d['misc'] = 23
# 判断 key 是否存在
'sidh' in d
# 当 key 不存在时,用 get 方法返回的是 None,或者自己指定的返回值
d.get('sd', -1)

set

set 类似与 dict,但是只有 key,没有对应的 value,在 set 没有重复的 key,创建 set 需要提供一个 list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
s= set([1,23,4,5])
# 在 set 重复的元素会自动被过滤,可以通过 add(key)来添加元素,但是添加重复的元素没有效果。
# 可以通过 remove(key)来移除元素。
# set 可以作数学意义上的交集、并集等操作
s1 = set([1,2,3])
s2 = set([3,4,5])
s1 & s2
s1 | s2
```
set 和 dict 不可放入可变对象,另外对于不可变对象,调用自身任何方法都不会改变自己, 而是会创造一个新的对象并返回。
## 条件判断和循环
### if 表达式格式
```python
if < 条件判断1>:
< 执行1>
elif < 条件判断2>:
< 执行2>
else:
< 执行3>

for 循环格式

1
for x in range(4): #range() 可以生成整数序列

while 循环格式

1
while < 条件判断 > :

函数

python 的函数相当与一个对象的引用。因此,可以将函数赋予一个变量,相当于给函数起了一个 别名。

1
2
3
# 函数定义
def function_name(parameter1, parameter2...) :
< 函数体 >

没有写 return 的函数会返回 None。定义一个空函数可以用 pass 语句

1
2
def nothing():
pass

pass 语句什么都不作,可以用来当占位符使用。 函数不会检查参数类型,我们可以自己加上类型检查,使用 isinstance 函数实现

1
2
3
4
5
6
7
def my_abs(x):
if not isintance(x,(int,float)):
raise TypeError('bad operand type')
if x >=0:
return x
else :
return -x

python 函数可以返回多个返回值:

1
x,y = move(x,y)

实际上,返回的只是一个 tuple,只是写法上简化了。

默认参数

1
2
def call_city(x,y, city='beijing',age=12):
pass

默认参数原则:默认值写在最后面, 也可以不按顺序提供部分默认参数,当需要指名参数名:

1
call_city(x,y, age=12)

默认参数,最好指向不变对象。

可变参数

可变参数与定义 list 参数的区别就是在参数前面加个 *,例如:

1
2
3
4
5
def calc_sum(*numbers):
sum =0
for n in numbers:
sum += n
return sum

对于函数体内部来说,numbers接受的是一个tuple。 如果有一个 list 或者 tuple 变量,要调用可变参数的话,可以在变量前加 *,把 list 和 tuple 转化为可变参数

关键字参数

关键字参数会在函数内部自动组装成一个 dict。示例

1
2
3
4
def person(name, age, **kw)
print 'name:',name, 'age:',age,'other:', kw
person('Michael', 30,city='beijing')

在调用函数时,可以只传入必选参数,也可以传入任意数量的关键字参数。

高级特性

切片

切片操作可以轻松的切成一段数列, 例如 L 是一个list

1
2
3
4
5
6
7
8
9
10
11
# 取前 3 个元素
L[0:3]
# 或
L[:3]
# 取后 10 个元素
L[-10:]
# 前十个数, 每个 2 个取一个
L[:10:2]
# 所有数, 每隔 5 个取一个
L[::5]
# 字符串同样支持切片操作.

迭代

dict 可以同时迭代 key 和 value:

1
for k, v in d.iteritems()

判断一个对象是否可以迭代, 可以用 collections 模块里的 iterable 类型:

1
2
isinstance('abd', Iterable)
output: True

同时迭代索引和元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for i, value in enumerate(list):
```
### 列表生成式
列表生成式可以看成对 for 循环语句的简化. 例如
```python
[x*x for x in range(1,11)]
output: [1,4,9,16,25,36,4964,81,100]
# 将生成的元素 x*x 放在前面, 后面跟 for 循环.for 循环后还可以加上 if 判断
[x*x for x in range(1,11) if x%2==0]
output:[4,16,36,64,100]
# 还可以使用两层循环
[m+n for m in 'ABC' for n in 'XYZ']
output:['AX','AY','AZ','BX','BY','BZ','CX','CY','CZ']

生成器

生成器只存储算法, 需要时才会将后续的元素计算出来, 从而节省大量的空间. 将上述列表生成式的 [] 改成 () 就创建了一个generator.

1
g = (x*x for x in range(1,11))

创建一个 generator 后, 可以通过 next() 来打印里面的元素, 或者使用 for 循环迭代. 还可以使用 yield 关键字, 将函数定义成generator, 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> def odd():
... print 'step1'
... yield 1
... print 'step2'
... yield 2
... print 'step3'
... yield 3
...
>>> o = odd()
>>> o.next()
step1
1
>>> o.next()
step2
2
>>> o.next()
step3
3

每当调用 next() 的时候, 遇到 yield 语句返回, 再次执行时, 会从上次返回的 yield 语句处继续执行.

函数式编程

所谓高阶函数可以理解为, 可以接受另外一个函数作为参数的函数, 还可将函数作为返回值.

匿名函数

1
lambda x: x*x

lambda 表示匿名函数, 冒号前面的 x 表示参数, 匿名函数只能有一个表达式. 返回值就是该表达式的结果.

装饰器

函数也是个对象, 赋给变量, 函数还有个 name 属性, 可以获得函数名称.