Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

时间:2022-05-27 10:07:04

词典

可以存储多个元素的对象成为容器,前面提到的list和tuple都属于容器类,这里介绍一个新的容器:词典。

  • 基本概念
    常见的创建词典的基本方法:

    dic={'键':值,'键':值,'键':值...}

    词典包含两部分,键和值,其中键一般为字符串,也可以为数字或真值(不可变的对象可以作为键)。值可以是任意对象,键和值两者一一对应。
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

    词典特殊的地方是,与表相比,他当中的元素是无序的,因此就不能通过下标来访问元素。词典是通过键来引用的。
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

    构建一个新的空词典:

    dic = {}

    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

    在词典中添加一个新的元素的方法:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

  • 词典元素的循环调用
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递
    可以看到最后添加了一个”gcg”但是它却并不在最后一个,也就是在词典里是没有顺序的。

  • 词典的常用方法
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

    删除其中的某一对:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递
    (说明:del是Python中保留的关键字,用于删除对象。
    【 HIGH.__delitem__(键)】等价于【del HIGH[键]】)

    查询词典中的元素对总数:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

文本文件的输入输出

Python具有基本的文本文件读写功能。Python的标准库提供有更丰富的读写功能。文本文件的读写主要通过open()所构建的文件对象来实现。

  • 创建文件对象
    我们打开一个文件,并使用一个对象来表示该文件:

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

    最常用的模式有:

    • r 打开只读文件,该文件必须存在。
    • r+ 打开可读写的文件,该文件必须存在。
    • w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
    • w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
    • a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
    • a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
    • 上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
      Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递
  • 文件对象的方法

    • 读取
      假如文件里已经有这么两行数据:
      Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

      Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

      Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

    • 写入
      因为CONTENT是读取的多行数据,其实Python将每一行当做一个元素存储在了一个列表中,因此我们可以将读出来的两行再写在文件之后。
      Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递
      结果:
      Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

模块

  • 引入模块
    我们之前看到了函数和对象。从本质上来说,它们都是为了更好的组织已经有的程序,以方便重复利用。模块(module)也是为了同样的目的。在Python中,一个.py文件就构成一个模块。通过模块,你可以调用其它文件中的程序。
    我们先创建一个Move.py文件,将它放在和main.py文件同一个目录中,然后在main.py中导入Move.py文件。
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

    然后在main.py导入:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递
    引入模块之后,我们可以通过模块.对象的方式来调用模块中的对象,包括函数和全局变量。
    Python还有一些其他的有用的导入方式 :
    重命名模块名:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

    指定只导入模块中的特定对象,而且可以直接访问,就相当于main.py中的全局对象那样访问:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递
    (因为只是导入了函数move,因此CONTENT是访问不了的。)

    从模块中导入所有对象,并且可以直接当成全局变量访问:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

  • 搜索路径
    上面的Move.py文件能被main.py文件找到是因为Move.py文件和main.py文件在相同的目录下,那么main.py还能在哪些路径下寻找导入的模块呢?

    • 程序所在的文件夹
    • 操作系统环境变量PYTHONPATH所包含的路径
    • 标准库的安装路径(windows系统是在python安装目录中的Lib文件夹中的site-packages目录中,Linux系统是在/usr/local/lib/python2.7/dist-packages中)
  • 模块包
    模块包顾名思义就是一些模块的集合,它是一个文件夹,我们将上面的Move.py文件放到一个叫module_bag的文件夹中,该文件夹和mian.py在同一个目录中:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

    需要注意的是在文件夹module_bag中必须包含一个__init__.py文件,提醒Python该文件夹为一个模块包,__init__.py可以是一个空文件
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

函数的参数传递

一般情况下,我们将参数传递给函数是都是根据函数中参数的位置,一一对应上去的,例如:
Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递
这时实参与abc一一对应。

  • 关键字传递
    为了方便查看,我们写一个函数:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递
    上面是使用默认的位置对应的方法传递的。
    有时候觉得根据位置传递过于死板,因此想根据自己方便,按照参数名字来给每个参数传递参数:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

    关键字传递可以和位置传递混用。但位置参数要出现在关键字参数之前:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

  • 参数默认值
    在定义函数的时候,使用形如a=19的方式,可以给参数赋予默认值(default)。如果该参数最终没有被传递值,将使用该默认值:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

    看看下面这个例子:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递
    说明:并不是输出2 4 10,因为如果某个参数赋了默认值,则其后面的参数也都必须有默认值,否则就会出错。

  • 包裹传递
    在定义函数时,我们有时候并不知道调用的时候会传递多少个参数。这时候,包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会非常有用。
    下面看一个例子:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递
    可以看到这个参数是一系列参数的集合,全部都传递给了parameters。两次调用,尽管参数个数不同,都基于同一个func定义。在func的参数表中,所有的参数被parameters收集,根据位置合并成一个元组(tuple),这就是包裹位置传递。
    其实在parameters前面不加*也可以实现该功能:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递
    可以看到,前面*parameters是Python自动将那一些列参数转化为一个元组赋个parameters,而后面这种方法是我们程序员在传参时认为手动传递一个元组给parameter。

    通过包裹传递一个字典:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递
    注意到实参中的a b c是不带引号的。

  • 解包裹
    * 和 **,也可以在调用的时候使用,即解包裹(unpacking),下面为例:
    Python成长之路(三)——词典、文本文件的输入输出、模块、函数的参数传递

    相应的,也存在对词典的解包裹,

    dict = {'a':1,'b':2,'c':3}
    func(**dict)
  • 混合
    在定义或者调用参数时,参数的几种传递方式可以混合。但在过程中要小心前后顺序。基本原则是:先位置,再关键字,再包裹位置,再包裹关键字,并且根据上面所说的原理细细分辨


参考资料:
https://www.shiyanlou.com/courses/214/labs/650/document


注:转载请注明原文出处:
作者:CUG_UESTC
出处:http://blog.csdn.net/qq_31192383/article/details/53729331