脚本
python是一种脚本语言
脚本和程序:
脚本与一般程序的主要区别在于是否编译。相对于程序而言,脚本更加随性。写完了脚本,直接就可以在某种具有解释功能的环境中运行。
非脚本语言(c,java)需要通过编译和链接等步骤,生成可执行文件,通过可执行文件在计算机上运行
python安装和环境设置
略
安装的anaconda和python3.8
运行和修改python脚本
略
与用户输入交互
name=input ("enter your name:")
print("hello there,{}!".format(name.title()))
提示用户输入姓名,在问候语中使用该输入。
num=int(input("enter an integer"))
print("hello"*num)
生成消息test
代码
处理异常
python由两种类型的错误:语法错误和异常。
如果没有使用正确的语法,并且python不知道如何运行代码,就会发生语法错误。如果python在执行代码时遇到意外情形,会发生异常。
常见异常:
ValueError:向内置操作或函数中传入类型正确但是值不合适的对象作为输入
AssertionError:断言语句失败了
IndexError:序列下标超出了范围
KeyError:在字典中找不到某个键
TypeError:向操作或函数中传入类型不受支持的对象作为输入
处理错误
Try语句:
可以使用try语句处理异常,
try:这是try语句中唯一必需子句。该块中的代码是python在try语句中首先运行的代码
except:如果python在运行try块时遇到异常,它将跳到处理该异常的except块。
else:如果python在运行try块时没有遇到异常,它将在运行try块后运行该块中代码
finally:在python离开此try语句之前,在任何情形下它都将运行此finally块中的代码,即使要结束程序。
指定异常
可以指定要再except块中处理哪个错误
try:
except ValueError:
则会捕获valueerror异常,但是不会捕获其他异常。
如果希望该程序处理多种异常,则可以再except后面添加异常元组:
try:
except(ValueError,KeyboardInterrupt):
或者分开
try:
except ValuError:
except KeyboardInterrupt:
示例:
运行结果
访问错误消息(相当于手动断点)
在处理异常时,访问其错误消息:
try:
except ZeroDicisionError as e:
print("ZeroDivisionError occurred:{}".format(e))
输出:
ZeroDivisionError occurred:division by zero
以然可以访问错误消息,辑视已经处理异常来防止程序崩溃
如果没有要处理的具体错误,依然可以访问消息:
try:
except Exception as e:
print("Exception occurred:{}".format(e))
Exception是所有内置异常的基础类。
读写文件
读取文件
f=open('my_path/my_file.txt','r')
file_data=f.read()
f.close()
首先使用内置函数open打开文件。需要文件路径字符串。open函数会返回文件对象,它是一个python对象,python通过该对象与文件本身交互。上面例子中,将此对象赋值给变量f
可以在open函数中指定可选参数。参数之一是打开文件时采用的模式。
在此示例中,使用r(只读模式) 这是模式参数的默认值(默认值是只读)
使用read访问文件对象的内容。该read方法会接受文件中包含的文本并放如字符串中。在此示例中,将该方法返回的字符串赋值给变量file_data
处理完文件后,使用close方法释放该文件占用的系统资源
写入文件
f=open('my_path/my_file.txt','w')
f.write("hello,there")
f.close()
以写入‘w’模式打开文件。如果文件不存在,python将创建一个文件。以写入模式打开现有文件,该文件中之前包含的所有内容将被删除 向现有文件添加内容,但是不删除其中的内容,可以使用附加(’a’)模式,而不是写入模式
使用write方法向文件中添加文本
关闭文件
With
python提供了一个特殊的语法,该语法会在使用完文件后自动关闭该文件
with open('my_path/my_file.txt','r') as f:
file_data=f.read()
with关键字能够打开文件,对文件执行操作,并在缩进代码执行之后自动关闭文件。
(练习题,关注)
导入本地,标准库和第三方模块
如果处理的是大型项目,需要将代码整理成多个文件并重复利用这些文件中的代码,则到二u脚本很有用。
如果要导入的python脚本与当前脚本位于同一个目录下,只需要输入import,然后是文件名,无需扩展名.py
每一个包目录下面都会有一个__init__.py
的文件,这个文件是必须存在的,否则,python就把这个目录当成普通目录而不是一个包。
__init__.py
可以是空文件,也可以又python代码,因为__init__.py
本身就是一个模块,模块名是包名
多级目录,组成多级层次的包结构
在自己创建模块时要注意命名,不能和python自带的模块名称冲突
使用模块
以sys模块为例,编写一个hello模块
#!/user/bin/env python3
# -*- coding:utf-8 -*-
'a test module'
__author__='xie'
import sys
def test():
args=sys.argv
if len(args)==1:
print('hello,world')
elif len(args)==2:
print('hello,%s!'%args[1])
else:
print('too many arguments')
if __name__=='__main__'
test()
第一行和第二行是标准注释,第一行注释可以让这个hello.py文件直接在unix/linux/mac上运行,第二行注释表示.py文件本身使用标准UTF-8编码
第四行是一个字符串,表示模块的文档注释,任何模块代码的第一个字符串都被视为模块的文档注释
第六行使用__author__
变量把作者写进去
前六行是python模块的标准文件模板,也可以全部删掉不写
代码部分:
首先导入sys模块,导入模块后,就有了变量sys指向该模块,利用sys这个变量,就可以访问sys模块的所有功能
sys模块有一个argv变量,用list存储了命令行的所有参数。argv至少有一个元素,因为第一个参数永远是该.py文件的名称:
运行 python hello.py 获得的sys.argv就是[‘hello.py’]
运行 python hello.py Michael 获得的sys.argv就是[‘hello.py’,‘Michael’]
import useful_functions
import语句在写python脚本的顶部,每个导入语句各占一行。
import语句会创建一个模块对象,叫做useful_functions。模块是包含定义和语句的python文件。要访问导入模块中的对象,需要使用点记法
import useful_functions
useful_functiona,add_five([1,2,3,4])
可以为导入模块添加别名,使用不同的名称引用它
import useful_functions as uf
uf.add_five([1,2,3,4])
使用if main块
为了避免运行从其他脚本中作为模块导入的脚本中的可执行语句,(python解释器把一个特殊变量__name__
置为__main__
,如果在其他地方导入该hello模块时,if判断将失败,因此,if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试)
将这些行包含在if __name__=="__main__"
块中。
或者,将它们包含在函数main()中并在if main块中调用该函数
当运行此类脚本时,python实际上会为所有模块设置一个特殊的内置变量__name__
。当运行脚本时,python会将此模块识别为主程序,并将此模块的__name__
变量设为字符串"__main__"
。
对于该脚本中导入的任何模块,这个内置__name__
变量会设为该模块的名称。
条件if __name__=="__main__"
会检查该模块是否为主程序
demo.py
useful_functions.py
运行结果
作用域
在一个模块中,可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用,可以通过_前缀来实现
正常的函数和变量名是公开的,可以被直接引用
类似__xxx__这样的变量是特殊变量,可以直接被引用,但是有特殊用途
类似_xxx和__xxx这样的函数或变量是非公开的,不应该被直接引用
非公开函数和变量不应该被直接引用,而不是不能被直接引用,是因为python 并没有一种方法可以完全限制访问非公开函数或变量,但是从变成习惯上不应该引用非公开(private)函数或变量。
关于标准库
datetime 当前时间和日期
zipfile 从zip文件中提取所有文件
time 现实代码的运行时间
csv 对于读取csv文件来说非常便利
collections 常见数据类型的实用扩展,包括OrderedDict,defaultdict和namedtuple
random 生成假随机数字,随机打乱序列并选择随机项
string 关于字符串的更多函数。此模块还包括使用的字母集合,例如string。digits(包含所有字符都是有效数字的字符串)
re 通过正则表达式在字符串中进行模式匹配
math 一些标准的数学函数
os 与操作系统交互
os.path os的子模块,用于操纵路径名称
sys 直接用于python解释器
json 适用于读写json文件(面向网络开发)
导入模块技巧
还有一些在不同情形下很有用的其他形式的import语句
1 要从模块中导入单个函数或类:
from module_name import object_name
2 要从模块中导入多个单个对象:
from module_name import first_object,second_object
3 要重命名模块:
import module_name as new_name
4 要从模块中导入对象并重命名:
from module_name import object_name as new_name
5 使用模块中的所有对象
import module_name
模块、软件包和名称
Standard标准库中的模块被拆分成了子模块并包含在软件包中。软件包是一个包含子模块的模块。子模块使用普通的点记法指定
import package_name.submodule_name
第三方库
使用pip安装第三方库。pip是在python3中包含的软件包管理器。它是标准python软件包管理器,但并不是唯一的管理器。另一个热门的管理器是anaconda,该管理器专门针对数据科学
要使用pip安装包,在命令行中输入"pip install"然后是软件包名称
会下载并安装该软件包,以便导入程序中。安装完毕后,可以使用从标准库中导入模块时用到的相同语法导入第三方软件包
使用requirements.txt文件
大型python程序可能依赖于十几个第三方软件包。为了更轻松的分享这些程序,程序员经常会在叫做requirements.txt的文件中列出项目的依赖项
beautifusoup4==4.5.1
bs4==0.0.1
pytz==2016.7
requests==2.11.1
该文件的每行包含软件包名称和版本号。版本号是可选项,但是通常都会包含。不同版本的库之间可能变化不大,可能截然不同,因此有必要使用程序作者在写程序时用到的库版本。
可以使用pip一次性安装项目的所有依赖项
pip install -r requirements.txt
一些实用的第三方软件包
IPython——更好的交互式python解释器
request——提供易于使用的方法来发出网络请求,适用于访问网络API
Flask——一个小型跨甲,用于构建网络应用和API
Django——一个功能更丰富的网络应用构建框架。Django尤其适合设计复杂、内容丰富的网络应用
Beautiful Soup——用于解析HTML并从中提取信息。事和网页数据抽取
pytest——拓展了python的内置断言,并且是最具单元性的模块
PyYMAL——用于读写YAML文件
NumPy——用于使python进行科学计算的最基本软件包。它包含一个强大的N维数组对象和实用的线性代数功能
pandas——包含高性能、数据结果和数据分析工具的库,pandas提供dataframe
matplotlib——二维绘制库,会生成达到发布标准的高品质图片,并且采用更重硬拷贝格式和交互式环境
ggplot——另一种二位绘制库,基于R’s ggplot2库
Pillow——python图片库可以python解释器添加图片处理功能
pyglet——专门面向游戏开发的跨平台应用框架
Pyganme——用于编写游戏的一系列python模块
pytz——python的世界时区定义
在解释器中进行实验
在终端里输入python启动python交互式解释器
在解释器中,提示符窗口中最后一行的值将自动输出。如果有多行代码需要输出值,以然需要使用print
定义函数时,需要自己添加缩进
解释器的不足之处是修改代码比较麻烦,如果在输入该函数时出现了拼写错误,或者忘记缩进函数的主体部分,无法使用鼠标将光标点到要点击的位置。需要使用箭头键在代码行中来回移动
可以引用在解释器中之前定义的任何对象
退出python交互式解释器,使用命令exit()/linux or mac按ctrl+D/windows按ctrl+Z,然后按下enter键
函数:
input()函数获取用户输入的任何内容并将其存储为字符串
eval() 将用户的输入解析为python表达式
readline()读取文件读取一行
append() 返回列表
.strip()删掉换行符