python学习总结.docx
- 文档编号:8129762
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:22
- 大小:35.52KB
python学习总结.docx
《python学习总结.docx》由会员分享,可在线阅读,更多相关《python学习总结.docx(22页珍藏版)》请在冰豆网上搜索。
python学习总结
本文基于《byteofpython》电子书及网络材料而写,电子书本身已很精简,因此不必长篇累牍,旨在抛砖引玉。
“【】”内表示补充说明。
python与脚本语言
首先我们知道,脚本与脚本解释器这两个概念是统一的、密不可分的。
脚本本质上就是文本文件(如用ASCII码所写的),这种文本文件用文本编辑器打开与普通的文本文件没有区别,只不过扩展名不是“.txt”,python脚本的扩展名通常是“.py”。
什么样的文本文件是脚本呢?
答案是:
针对特定脚本解释器的语法规则所编写的,供脚本解释器来使用的文本文件。
计算机仅有脚本还是不能工作(它只是文本文件),我们需要一种工具软件,用来把脚本中的代码解释成计算机指令,同时让计算机立即执行这些指令,这种工具就是脚本解释器。
很显然,使用不同语法规则编写的脚本应使用不同的解释器来解释执行,因为每种脚本实际上是专为其解释器而写的,是按照解释器能识别的语法规则而写的。
如果你想通过脚本使计算机工作,就要在系统中安装一种脚本解释器,然后根据这种解释器规定的语法规则编写脚本,最后启动解释器来执行这个脚本。
python是众多“脚本解释器+语法规则”的一种,类似还有bash、perl、javascript等等。
比较C与python
1.代码层面看C与python
所谓不同编程语言,在代码层面来看,主要不同之处在于它们的语法规则,掌握了一种编程语言的语法规则,你就可以写出一种代码。
我们写C语言代码,就是按照C语言规定的语法规则来定义变量、函数、数据结构等。
同样地,遵照python的语法规则就可以编写python代码,这与写C代码没什么不同。
2.代码的存在形式
C语言中有源文件、目标文件、可执行文件这些概念,python中只有脚本及解释器。
所谓的脚本、程序或者软件都是指保存代码的文本文件(虽然为了加快python模块导入时的速度,解释器会生成一种扩展名为”.pyc”的文件,它们只是用来保存中间状态的)。
由于脚本既是可运行程序又是代码,可读性强、修改程序方便(不必编译,修改即可执行)是脚本的两大优点。
3.从代码到执行
C语言写好之后,我们根据目标CPU指令集来选择特定的工具链(如编译、链接工具),用它将C代码最终编译为目标CPU可直接执行的二进制文件,然后将这个二进制文件装载到内存中,执行时再将内存中程序入口地址传递给CPU,进而逐条执行程序中的指令。
这是使用C语言编码,到最终计算机执行指令的过程。
使用python语言编码之后的步骤与此不同:
python代码不需要被编译为可执行文件,它需要通过python解释器来控制计算机工作。
就是说,系统中必须事先安装好了python解释器,python解释器把python代码解释成CPU可执行的指令并运行这些指令。
但python解释器如何解释成可执行指令,又如何控制CPU来执行,这对用户来说是不可见的。
用户使用时只要以python代码作为输入来运行解释器,解释器就会自动解释并运行这些程序。
学习《byteofpython_chn》体会
Python是高层次的面向对象的编程语言。
优点是代码简洁、简单易学,缺点是运行速度较慢。
我们可以在python代码中调用C编译生成的动态链接库来提升程序运行速度。
很多发布的linux系统都自带了python解释器,因此python在linux平台上应用广泛,很适合GUI、测试程序等各类软件的开发。
建议学习时把书上提供的示例代码上机操作一遍,动手写python代码可以迅速掌握python。
学习摘要(基于linux系统)
4.两种python执行方式
a.进入python的shell下逐行执行:
在终端(Terminal)下键入“python”按回车(解释器被启动),进入python的shell,此时可以输入python语句,按回车执行。
按“左侧ctrl+D”退出python的shell。
输入“python-V”可查看python版本号(注意参数V是大写)。
b.在终端下直接调用python脚本执行:
可以在终端命令行指定解释器并调用,如“pythonhello.py”;或者可以在脚本文件首行指定解释器,终端命令行只需输入“./hello.py”调用,此方式见下文“创建并执行脚本文件”。
【超级终端实际就是一种shell,linux默认指定为bash。
在命令行中指定解释器时,脚本若在当前目录下,不必指定路径“./”;在脚本首行指定解释器时,命令行中必须指定路径名】
5.创建并执行脚本文件
a.创建一个名为“hello.py”的脚本文件(黄色背景表示脚本的内容):
[root@Fedora10~]#vimhello.py
#!
/usr/bin/python
#filename:
hello.py
print“hello,world”
b.设置脚本文件可执行权限:
[root@Fedora10~]#chmoda+xhello.py
c.执行脚本文件:
[root@Fedora10~]#./hello.py
【超级终端下会显示:
“hello,world”】
d.步骤说明
在文件开头写“#!
/usr/bin/python”,这是指定该脚本使用的解释器所在的目录。
因为python的默认安装目录是“/usr/bin/python”,所以这里如此指定,真实情况要按照python的实际安装目录来指定。
也可以不在文件开始处指出解释器,这种情况下应在终端命令行中指定解释器,如下:
[root@Fedora10~]#python./hello.py
6.python中的缩进
缩进是语法规则相关的,它决定语句的层次(类似C语言中用“{}”来表示层次一样)。
同一层次语句必须有相同缩进,否则解释器会报错。
Python函数没有明确的开始(begin)或者结束(end),也没有用大括号来标记函数从哪里开始从哪里停止。
唯一的定界符就是一个冒号(:
)和代码自身的缩进。
例如:
defsome_func():
i=3
print“numberis%d“%i
7.字符串的使用
1.单引号与双引号在python中等效使用
a.三引号(’’’或”””)可用来指示跨行的字符串,在其中,单、双引号均可使用。
b.Python中字符串“what’sthis”表示方式
方式1:
’what\’sthis’.这里用到了转义符’\’
方式2:
”what’sthis”
c.行末的单独一个反斜杠表示字符串在下一行继续,而不是开始一个新的行:
"Thisisthefirstsentence.\
Thisisthesecondsentence."
等价于
"Thisisthefirstsentence.Thisisthesecondsentence."
d.用r或R指定自然字符串
r”Happy\n”,因为用’r’指定为自然字符串,因此’\n’不会被解释器理解为回车换行符,而是’\’和’n’这两个字符,因此打印时会打印出”Happy\n”这7个字符。
e.用u或U指定使用unicode编码.如:
u”Happy”
f.连写的两个字符串会被解释器理解为一个连续的字符串
“what’s””yourname”会被理解为”what’syourname”
8.说明几个运算符:
“**”表示“幂”。
如:
3**4=3的4次幂=81
“//”表示“取整除”。
如:
4//3.0=1.0
“not、and、or”:
(布尔)非、(布尔)与、(布尔)或
9.文档字符串
函数(模块或类)的第一个逻辑行是其文档字符串,惯例是一个多行的字符串。
首行以大写字母开始,句号结尾;次行是空行;第三行开始是详细描述。
举例:
'''Printsthemaximumoftwonumbers.
Thetwovaluesmustbeintegers.……'''
使用“函数名.__doc__”来得到某函数的文档字符串,例如这样用:
printsome_func.__doc__
10.数据结构--简介
python中每种数据类型都被当作对象。
虽然Python中的每个值都有一种数据类型,但我们不需要声明变量的数据类型,因为python会根据每个变量的初始赋值情况分析其类型,并在内部对其进行跟踪,当然这种“i=long(12)”带类型来定义变量的方式也是支持的。
Python有多种内置数据类型,各类型关键字可用于类型强制转化、作help()的参数、定义变量等。
以下是比较重要的一些:
a.布尔型:
关键字bool,值为True或False
b.整数:
关键字int,如3,-1
c.浮点数:
关键字float,如3.2,7.92
d.字符串型:
关键字str,如”hellopython”
e.列表:
关键字list,是值的有序序列,如[3,2,5]
f.元组,关键字tuple,是有序而不可变的值序列。
g.集合是装满无序值的包(注意,“集合”在不同版本间略有不同)
h.字典是键值对的无序包
【要使用C语言类型的数据,需要导入ctypes模块,以便使用c_int、c_long等类型。
可以在python的shell先“importctypes”然后“help(ctypes)”查看具体规定】
11.数据结构--“列表(list)”
list是一组有顺序的数据,它的元素(对象)个数是变的(后面要说的元组则是固定的)。
a.各种内建方法
>>>list_a=[1,2]/*定义list_a含有1,2两个对象*/
>>>list_a.append
(2)/*添加一个对象到末尾*/
>>>list_a/*查看list_a中内容*/
[1,2,2]/*shell中显示*/
>>>list_a.count
(2)/*返回list_a中对象是2的个数*/
2/*shell中显示有2个值为2的对象*/
>>>list_b=[3,4]/*定义list_b含有3,4两个对象*/
>>>list_a.extend(list_b)/*在list_a末尾添加添加list_b*/
>>>list_a/*查看list_a中内容*/
[1,2,2,3,4]/*shell中显示*/
>>>list_a.index(3)/*返回第1个匹配的指定值在list中的位置,list中第1个对象的位置是0,第2个对象位置是1,以此类推*/
3/*shell中显示*/
>>>list_a.insert(2,’ok’)/*在位置是2的对象前添加对象’ok’*/
>>>list_a/*查看list_a中内容*/
[1,2,‘ok’,2,3,4]
>>>list_a.pop()/*删除并返回list中最后一个对象*/
>>>list_a.remove
(2)/*删除第1次出现的匹配指定值的对象*/
>>>list_a/*查看list_a中内容*/
[1,‘ok’,2,3,4]
>>>list_a.reverse()/*将list_a中的所有对象的位置反转*/
>>>list_a/*查看list_a中内容*/
[4,3,2,‘ok’,1]
list_a.sort(cmp=None,key=None,reverse=False):
对list_a排序
Key:
指定“取值函数”。
取值函数带1个参数。
sort方法从list_a中取出元素,作为实参传递给取值函数,取值函数做些处理,再将处理后的返回值传递给比较函数。
cmp:
指定“比较函数”。
比较函数带2个参数。
比较函数接收取值函数传送过来的2个参数,经过某种比较,返回比较结果(-1,0,1)。
在写具体比较函数时,往往会用到python内建函数“cmp()”
reverse:
指定为True时,将排序后序列顺序转置,否则无动作。
【list_a.sort()不指定任何参数时,对list_a按小从到大排序】
b.列表使用:
下标方式,结合切片操作符’:
’
>>>list_a[2]=‘ok’/*给列表中一项赋值*/
>>>list_b=list_a[2:
]/*将list_a[2]起到最后一个元素,都值赋给list_b*/
>>>list_b=list_a[:
3]/*将list_a中第1个至list_a[2]赋给list_b,不包括list_a[3]*/
>>>list_b=list_a[1:
4]/*将list_a[1]至list_a[3]赋给list_b,不包括list_a[4]*/
>>>list_b=list_a[1:
-1]/*将list_[1]至list_a中最后一项赋给list_b。
-1表示最后一项,-2表示倒数第2项,以此类推*/
c.在list中查找数据
forvalueinlist_a:
/*动作代码块:
使用value的动作*/
【临时变量value遍历list_a,循环取值,每取到一次值,执行一次动作代码块】
d.用for语句定义列表
>>>my_list=[2*iforiinrange(0,5)ifi>2]/*形式为[表达式,变量范围,条件]*/
(1)表达式:
2*i,i是变量
(2)变量范围:
foriinrange(0,5)
(3)条件:
ifi>2
再举一例:
>>>list_a=[2,3,4,5,6]
>>>list_b=[3*iforiinlist_aifi%2==0]
>>>printlist_b/*终端显示[6,12,18]*/
12.数据结构--“元组(tuple)”
tuple是一组有序且不可改变的数据,它的元素(对象)个数是固定的。
我们有时候会强制转换my_tuple=tuple(list_a),由list_a得到一个元组my_tuple;或者list_a=list(my_tuple)由一个元组得到一个列表。
关于使用方法,也是下标方式,与列表一样。
记住,它的值不能改变,因此不能赋值。
13.数据结构--“字符串(str)”
字符串同列表,元组一样,都是序列。
序列的特点是“索引”和“切片”,即我们可以取得序列中的某一项,或者某一部分。
>>>my_str=‘Jason’/*定义字符串my_str*/
>>>my_str.startwith(‘Jas’)/*若my_str以’Jas’开头,返回True,否则返回False*/
>>>if‘a’inmy_str:
/*判断my_str中是否含有字符’a’*/
>>>my_str.find(‘a’)/*返回’a’在my_str中的位置,找不到则返回-1*/
>>>ss=‘_*_’/*定义字符串ss*/
>>>my_list=[‘a’,’b’,’c’]/*定义列表my_list*/
>>>list_a=ss.join(my_list)/*使用ss来连接my_list中各元素,返回组成的字符串给list_a。
ss与my_list均未改变*/
>>>list_a=my_str.replace(‘a’,‘b’)/*my_str中的’a’替换成’b’形成的字符串赋给list_a。
my_str实际未变*/
14.数据结构--“字典(dict)”
字典就是“键名/数值”对(简称‘键值对’)无序的合集。
键名是唯一的,不可变的,键值是可以改变的。
>>>my_dict={‘Jason’:
2011,‘Anson’:
2012}/*定义字典,包含2个键值对*/
>>>my_dict.items()/*返回一个列表:
列表元素是元组(每个键值对组成一个二维元组)*/
【foriteminmy_dict.items()可用来在my_dict中遍历,类似列表中介绍的遍历方法】
>>>my_dict.has_key(‘Jason’)/*判断my_dict中是否有键名’Jason’,有返回True,否则返回False*/
>>>delmy_dict[‘Jason’]/*删除键名为’Jason’的键值对*/
>>>dict_a=my_dict.copy()/*将my_dict复制给新建字典dict_a*/
>>>data=my_dict.get(‘Jason’)/*从键名为’Jason’的对中取出值,赋给data,找不到时返回None*/
2011/*屏幕显示内容*/
>>>my_dict.keys()/*返回所有键名组成的列表*/
>>>my_dict.values()/*返回所有键值组成的列表*/
>>>my_dict.pop(‘Jason’)/*删除键名为’Jason’的键值对,返回该对的值*/
>>>my_dict.popitem()/*随时删除一个键值对,返回二维元组(key,value)*/
>>>my_dict.clear()/*清除所键值对*/
>>>my_dict.update(dict_a,**dict_b)/*在my_dict中添加dict_a,dict_b中各键值。
可以只用第一个参数,即一次只添加一个字典*/
15.python数据结构--“集合(sets)”
我所理解的,集合的概念就是数学上所称的集合的概念。
关于集合的操作,新老版本略有不同。
在python2.5版中,sets是作为一个系统模块存在的,并非是内建的数据结构,使用它要导入模块,然后基于list来创建,如:
>>>importsets
>>>list_a=[1,2,3]
>>>set_a=sets.Set(list_a)/*基于list_a创建集合set_a注意sets.Set中红色S是大写*/
【新版本不必导入模块,可以直接这样定义一个集合:
set_a={1,2}】
>>>set_a.add(4)/*向set_a中添加元素4*/
>>>set_a.discard
(2)/*删除集合set_a中的元素2*/
>>>set_b=set_a.copy()/*将set_a内容复制给set_b。
*/
【“set_b=set_a”表示“引用”关系,并非是复制】
>>>set_a.remove
(2)/*从集合set_a中删除2*/
>>>set_a.pop()/*从集合set_a中随机删除一个值,并返回该值。
从空集合中pop会引发KeyError*/
>>>set_a.clear()/*删除集合中所有的值,留下一个空集合*/
>>>set_a.update([5,9,2])/*将5,9,2(可以是任意多个值)加入集合,根据数字中集合的概念,相同的值不会重复加入。
新版本参数格式或许不同*/
>>>set_c=set_a|set_b/*set_c为set_a及set_b的并集*/
>>>set_c=set_a&set_b/*set_c为set_a及set_b的交集*/
>>>set_c=set_a-set_b/*set_c为set_a去掉与set_b公共的部分*/
>>>set_c=set_b-set_a/*set_c为set_b去掉与set_a公共的部分*/
>>>if3inset_a:
/*判断set_a中是否有元素3*/
>>>set_a.issubset(set_b)/*判断set_a是否为set_b的子集,返回True或False*/
>>>set_a.issuperset(set_b)/*判断set_a是否为set_b的超集,返回True或False*/
【if语句中,空集合为False,任何非空集合为真值】
16.关于模块
从功能上讲,每个用python编码的合理的脚本应是一个功能模块,用“.py”作扩展名。
Python也能够调用由c/c++编译生成的动态链接库,这种能力大大提升了整个程序的运行速度【如内建模块,系统中并没有它们的源代码】。
a.Import语句
import语句用来导入其它模块,主要有两种用法:
用法1:
“importA”表示导入整个模块A
用法2:
“fromAimportB”表示导入模块A下的对象B(B可以是任何对象,python中一切皆为对象,如类,变量等)。
【假设模块A中有子模块B,而B中有个函数C,我们要调用这个函数C。
如果“importA”,就要“A.B.C()”,用“fromAimportB”,只要“B.C()”,就是说可以从导入的具体对象开始引用】
默认导入路径在sys.path变量中定义。
可以使用sys.path.append("目录")来添加导入路径。
例如:
importsys
sys.path.append("/usr/test”)/*将/usr/test目录添加到sys.path变量中*/
importMyModule/*导入在/usr/test中的MyModule模块*/
b.直接使用python编码的模块的情况。
例如:
Importos/*导入os模块*/
os.mkdir(“/mnt/share”)/*调用os模块的mkdir()函数*/
【第一次使用import导入模块时,模块的主代码块(即函数与类之外的部分)会被执行,可以使用下述方法来控制是否在被导入时执行:
If__name__==“__main__”:
/*主代码块放在这里*/】
c.通过内建的ctypes模块,加载由c/c++编译得到的动态链接库的情况。
具体请看下文中,“常用模块功能”中的“ctypes模块”。
d.使用cython工具,将类似python风格的代码编译成c代码,然后再用上例中介绍的方法编译成动态链接库,以供加载调用。
例如:
cythonsome.pyx/*调用cython命令将cython文件some.pyx编译成some.c*/
gccsome.c–fPIC–shared–I/usr/include–osome.so
【cython算是另一种类python语言,混合了python与c的编程风格,有自己独立的“编译器+语法规则”。
用途是使用较简洁的类python代码,编译生成c语言源码,最终目的是生成动态链接库供python代码加载调用(当然由c源码编译为动态链接库的过程不是cython编译器的工作),以提高python程序的运行速度。
使用cython还可以快速应用python2代码到python3中。
cython官网下载http:
//www.cython.org/】
17.定义一个函数
a.defmy_func(arg1,arg2):
/*函数执行代码块*/
【使用”def”关键字表达开始定义一个函数,函数名后接参数(不需指定类型),参数个数不限。
然后要加一个冒号。
函数执行代码块是在同一长度缩进之下。
】
b.defmy_func(arg,*args):
printarg,args
【*前缀表示从第2个参数起所有参数都会作为一个元组存在于args中,调用上面这个函数就可以看到实现情况了。
】
c.defmy_func(**args):
【**前缀表示从第1个参数起所有参数都会作为字典键值对存在于arg
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- python 学习 总结