原标题:Sargent的量化经济学(6):Python基础
许文立 武汉大学经济与管理学院 xuweny87@163.com
许坤 安徽大学经济学院 kunxu2014@126.com
本讲呈现了阅读和编写Python代码所必需的编程语言基础。
概要
主题:
数据类型
输入
基本文件I/O
迭代的Python方法
更多的用户自定义函数介绍
比较和逻辑
标准Python风格
数据类型
迄今为止,我们粗略地看了一些常用的数据类型,例如字符型、整数型、浮点型和列表型
下面,我们来学习更多的数据类型
原始数据类型
特别简单的一种数据类型就是布尔值,它要么为真,要么为假
在算数表达式中,真用1表示,假用0表示
这被称为布尔算术,其在编程中非常有用
用于表达数字的两种最常用的数据类型就是整数型和浮点型
在计算机中,这两者是有差异的,因为浮点型具有更多的信息,而整数算术运算则更加直观
警告
小心:如果你仍用Python 2.x,两个整数的除法只返回整数部分
例如
对于Python 3.x来说
但是,下面的句法不论哪种版本都是一样的
复数是Python中另一种原始数据类型
此外,还有许多原始数据类型,我们将会在必要的时候进行介绍
集成器
Python有许多基本类型来储存(可能相异的)数据集
我们在前面已经讨论过了lists
一种相关的数据类型就是tuples,它是“不变的”lists
在Python中,一个目标被称为不变的,就意味着它一旦被创建就不能改变
Lists是可变的,而tuples则不可变
在后面,我们还会更加详细的解释可变与不可变,并说明为何它们之间的差异如此重要
切片符号
为了读取一个lists或者tuple中的多个元素,可以使用Python的切片符号
例如
通用规则a[m:n]返回n-m个元素,始于a[m]
负数也可以
同样,切片符号也可以用于tuples和字符型
Sets and Dictionaries
我们在继续讲之前,还有两个集成类型是sets(https://docs.python.org/3/tutorial/datastructures.html#sets)和dictionaries()
Dictionaries非常类似于lists,除了项目被命名,而不是别编号
名称“name”和“age”被称为keys
这些keys映射到('Frodo'and33)的目标被称为值(values)
set()函数创造集合
输入
自始至终,Python就以下列两个原则进行构建
小规模核心语言
许多不同的实验室或者模块中所带有的额外函数
例如,如果你要计算任意数字的平方根,没有现存函数来计算它
因此,你需要从一个模块中输入计算函数,在这种情形下,自然就是math
早前,我们已经讨论了一些输入的机制()
注意:math模块是标准实验室的一部分,它也是每个Python版本的一部分
另一方面,我们后面所使用的一些科学实验室则不是标准实验室中的一部分
随着讲座的推进,我们会讨论更多的模块
在Python学习过程中,你们会经常看到下列句法
这里的frommathimport*将math中所有函数都放进当前“namespace”——我们后面定义的一个概念
实际上,在大部分时候,应该避免这类句法
因为这会将许多未明确列示的变量名吸入,这就会导致冲突
Input and Output
我们来快速浏览一下输入和输出文件
我们仅仅只是讨论读写文本文件
输入和输出
我们从写开始
其中
嵌入式函数open()创造一个文件载体
write()和close()都是文件载体的方法
那么,我们所创造的文件在哪?
回忆一下,Python有当期工作路径的概念
或者,在Ipython或者Jupyter notebook
你们可以利用文件浏览器或者另一些方法来确认文件newfile.txt确实在当期工作路径中(用%ls来列出当期工作路径中的所有文件)
我们也能用Python读newline.txt的内容
路径
注意,如果newfile.txt不在当前工作路径,那么,这就是open()失败
在这个例子中,你要么声明这个文件的完整路径
要么,改变当期工作路径至文件所在路径,通过os.chdir('path_to_file')
(在Python中,用cd改变路径)
迭代
计算中,最重要的任务之一是穿过数据序列,执行既定的步骤
Python的长处之一就是简单、灵活界面,通过for循环来执行迭代
不同载体的循环
许多Python载体都是“可迭代的”
考虑文件
(https://github.com/QuantEcon/QuantEcon.lectures.code/blob/master/python_essentials/us_cities.txt),其中列示了美国的城市和人口
假设我们想要让这些信息更具有可读性,大写名字,并用逗号标记千位
程序读取数据
这里format()是一种字符型方法,用于插入变量到字符中()
输出如下
每一行的重定格式是三种不同字符型方法的结果,更详细的描述在后面
对我们来说,该程序中有趣的部分是第二行,即
文件载体f是可迭代的,因为它能放入for循环的in命令右边
文件中迭代步骤要通过每一行
没有指引的循环
你们可能已经注意到的一件事就是Python更偏好没有明确指引的循环
例如
优于
当你比较这两种方案时,你就会看到为什么第一个更好
Python提供了一些措施来简化无指引循环
其中之一就是zip(),
例如,试试运行下列代码
zip()函数对创造dictionaries也很有用——例如
如果我们确实需要一个来自于list中的指标,那么,一个选择就是利用enumerate()
要理解enumerate()能做什么,我们看看下面的例子
比较和逻辑运算符
比较
许多不同类型的表达式都能得到布尔值(例如,TrueorFalse)
常用的是比较,例如
Python一个非常nice的特征就是能输入链式不等式
检验等式的时候,我们使用=
对于“不等”,用!=
注意,当检验条件时,我们能使用任何有效的Python表达
规则:
等于0,空集或者集合(字符、列表等)以及None都与False等价
例如,在if语句中,[]和()与False等价
其他值则与True等价
例如,在if语句中,42等价于True
联合表达式
我们能使用and,or,not来结合表达式
有许多标准的逻辑连接
记住:
PandQ为真,如果两个都为真,否则为假
PorQ为假,如果两个都为假,否则为真
更多函数
我们介绍更多的函数,它们对于好的编程非常重要
Python有许多内置函数可用,而不需要import
还有两个内置函数是any()和all()
Python的内置函数可见
下面,我们来阐述一下用户自定义函数,用关键词def
为什么要写函数?
用户自定义函数对于阐明代码非常重要
分离不同的逻辑分支
促进代码再利用
(同一件事做两次总是一件浪费时间的事)
用户自定义函数基础可见
Python函数的灵活性
Python函数非常灵活
尤其是
在既定文件中,任何数量的函数都能被定义
可以在另一些函数内部定义函数
任何载体都能作为函数的元素,包括另一些函数
函数能返回任何类型载体,包括函数
注意,一个函数能包含任何多个return表达
当第一个返回受阻时,函数执行就会终止,例如
如果没有返回表达的函数,会自动返回一个特殊的Python目标None
文档注释
Python可能为函数、模块等等增加评论注释,被称为docstrings
对于docstrings,一个很好的特征就是在运行时也可以添加
例如
在运行上述代码后,文档注释依然可用
单行函数:lambda
关键词lambda用于创造简单的单行函数
例如
是完全等价的
要创造函数f(x)=x^3,我们能使用lamda
责任编辑: