Python_3

词典

与列表相似,词典也可以储存多个元素
这种储存多个元素的对象称为容器(container)

1、基本

创建:

1
2
3
dic = {'tom':11, 'sam':57, 'lily':100}
print type(dic)

词典的元素没有顺序。。
不能通过下标引用元素。词典是通过键来引用

引用、赋值、增添元素:

1
2
3
4
5
6
7
print dic['tom']
dic['tom'] = 30
dic['lilei'] = 99
print dic

2、词典元素的循环调用

1
2
3
dic = {'lilei':90, 'lily':100, 'sam': 57, 'tom':90}
for key in dic:
print dic[key]

3、词典的常用方法

1
2
3
4
5
6
7
8
9
10
11
print dic.keys() # 返回dic所有的键
print dic.values() # 返回dic所有的值
print dic.items() # 返回dic所有的元素(键值对)
dic.clear() # 清空dic,dict变为{}
del dic['tom'] # 删除 dic 的‘tom’元素
print len(dic) # 用len()查询词典中的元素总数

文本文件的输入输出

文本文件的读写主要通过open()所构建的文件对象来实现。

1、创建文件对象

对象名 = open(文件名,模式)

最常用的模式有:

  • r 打开只读文件,该文件必须存在。

  • r+ 打开可读写的文件,该文件必须存在。

  • w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

  • w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

  • a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

  • a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

  • 上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。

比如:

1
f = open("test.txt","r")

2、文件对象的方法

读取:

1
2
3
4
5
content = f.read(N) # 读取N bytes的数据
content = f.readline() # 读取一行
content = f.readlines() # 读取所有行,储存在列表中,每个元素是一行。

写入:

1
f.write('I like apple!\n') # 将'I like apple'写入文件并换行

关闭文件:

1
f.close() # 不要忘记关闭文件

模块

在Python中,一个.py文件就构成一个模块
通过模块,你可以调用其它文件中的程序

1、引入模块

先写一个first.py文件,内容如下:

1
2
def laugh():
print 'HaHaHaHa'

再写一个second.py,并引入first中的程序:

1
2
3
4
import first #将first文件引入
for i in range(10):
first.laugh()

引入模块后,可以通过 模块.对象 的方式来调用引入模块中的某个对象。
上面例子中,first为引入的模块,laugh()是我们所引入的对象。

Python中还有其它的引入方式:

1
2
3
4
5
import a as b # 引入模块a,并将模块a重命名为b
from a import function1 # 从模块a中引入function1对象。调用a中对象时,我们不用再说明模块,即直接使用function1,而不是a.function1。
from a import * # 从模块a中引入所有对象。调用a中对象时,我们不用再说明模块,即直接使用对象,而不是a.对象。

2、搜索路径

Python会在以下路径中搜索它想要寻找的模块:

  • 程序所在的文件夹

  • 操作系统环境变量PYTHONPATH所包含的路径

  • 标准库的安装路径

如果你有自定义的模块,或者下载的模块,可以根据情况放在相应的路径,以便Python可以找到。

3、模块包

可以将功能相似的模块放在同一个文件夹(比如说this_dir)中,构成一个模块包。

import this_dir.module

引入this_dir文件夹中的module模块。

该文件夹中必须包含一个 init.py 的文件,提醒Python,该文件夹为一个模块包。init.py 可以是一个空文件。

函数的参数传递

1、关键字传递

关键字传递可以和位置传递混用。但位置参数要出现在关键字参数之前:

1
2
3
4
def f(a,b,c):
return a+b+c
print(f(1,c=3,b=2))

2、参数传递

定义函数的时候,可以给参数赋予默认值(default)。
如果该参数最终没有被传递值,将使用该默认值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def f(a,b,c=10):
return a+b+c
print(f(3,2)) #c没有被赋值,c将使用默认值10
print(f(3,2,1)) #c被赋值为1,不再使用默认值
```
###**3、包裹传递**
在定义函数时,我们有时候并不知道调用的时候会传递多少个参数。
包裹位置传递:
```Python
def func(*name):
print type(name)
print name
func(1,4,6)
func(5,6,7,1,2,3)

在func的参数表中,所有的参数被name收集,根据位置合并成一个元组(tuple)。
为了提醒Python参数,name是包裹位置传递所用的元组名,在定义func时,在name前加*号。

包裹关键字传递:

1
2
3
4
5
6
def func(**dict):
print type(dict)
print dict
func(a=1,b=9)
func(m=2,n=1,c=11)

dict是一个字典,收集所有的关键字,传递给函数func。
为了提醒Python,参数dict是包裹关键字传递所用的字典在dict前加 符号

包裹传递的关键在于定义函数时,在相应元组或字典前加 * 。

4、解包裹

* 和 **,也可以在调用的时候使用,即解包裹(unpacking):

1
2
3
4
5
def func(a,b,c):
print a,b,c
args = (1,3,4)
func(*args)

所谓的解包裹,就是在传递tuple时,让tuple的每一个元素对应一个位置参数。
在调用func时使用 * ,是为了提醒Python:我想要把args拆成分散的三个元素,分别传递给a,b,c。

相应的,也存在对词典的解包裹,使用相同的func定义,然后:

1
2
dict = {'a':1,'b':2,'c':3}
func(**dict)

在传递词典dict时,让词典的每个键值对作为一个关键字传递给func。

5、混合

在定义或者调用参数时,参数的几种传递方式可以混合。
顺序:

  • 先位置,再关键字,再包裹位置,再包裹关键字。