Python学习笔记
数
python中有4种数——整数、长整数、浮点数、复数
整数 2
长整数 比整数大的整数
浮点数 3.23 52.3E-4
复数 -5+4j 2.3-4.6j
字符串
使用单引号(’)
你可以用单引号指示字符串,就如同’Quote me on this’这样。所有的空白,即空格和制
表符都照原样保留。
- 使用双引号(”)
在双引号中的字符串与单引号中的字符串的使用完全相同,例如”What’s your name?”。 - 使用三引号(’’’或”””)
利用三引号,你可以指示一个多行的字符串。你可以在三引号中自由的使用单引号和双
引号。例如:
‘’’This is a multi-line string. This is the first line.
This is the second line.
“What’s your name?,” I asked.
He said “Bond, James Bond.”
‘’’
转义符
在字符串中包含‘,
- 用\’,eg what’s your name ——> ‘what\’s your name’
- ”what’s your name”
在双引号中表示双引号,也需要反斜杠\”
表示反斜杠本身,则\\
字符串行末单独的一个反斜杠表示字符串在下一行继续,而不是新的一行
“abcd\
efgh.”
等价于 “abcdefgh.”
自然字符串
要指示某些不需要如转义符那样的特别处理的字符串,则要指定一个自然字符串
通过给字符串加上前缀r或R来指定
r”abcdefgh\n”
Unicode字符串
在字符串前加上前缀u或U 如u“abcdefg”
字符串是不可变的
一旦创造了一个字符串就不能再改变它了
按字面意义级连字符串
把两个字符串按字面意义相邻放着,会被python自动级连
‘what\’s’’your name?’ 会被自动转为”what’s your name”
注释
- python没有char数据类型
- 单引号和双引号完全相同
- 对正则表达式:一定要用自然字符串处理正则表达式,否则会需要很多反斜杠。如后向引用符可写成’\\1’或r’\1’
变量
标识符的命名
- 第一个字符必须是字母表中的字母(大写或小写)或下划线_
- 标识符名称其他部分可以由字母(大写或小写)、下划线_或数字组成
- 标识符名称对大小写敏感
对象
python把程序中用到的任何东西都称为对象
使用变量时是需要给它赋一个值,不需要声明或定义数据类型
逻辑行与物理行
物理行就是在编写程序时所看见的
逻辑行是python看见的单个语句。python假定每个物理行对应一个逻辑行
python默认希望每行只使用一个语句
- 在一个物理行使用多于一个逻辑行,则需要使用分号;(不建议)
- 在多个物理行写一个逻辑行,明确的行连接
print \
i
等价于 print i
另有暗示的行连接
缩进
错误的缩进会引发错误
不要混合使用制表符和空格缩进
建议每个缩进层次使用单个制表符或者两个或四个空格
运算符与表达式
大多数语句包含表达式
表达式可分解为运算符和操作数

and和or存在短路计算
运算符优先级

运算符通常由左向右结合,即具有相同优先级的运算符按照从左向右顺序计算
一些运算符如赋值运算符则由右向左结合,即a=b=c被处理为a=(b=c)
控制流
if
1 | if 条件1: |
(python中没有switch语句)
for
eg.1
2
3
4
5for i in range(m,n):
xxxx
else:
xxxx
()
上述例子用了内建的range函数
提供两个数,range返回一个序列的数,该序列从第一个数开始到第二个数为止
如range(1,5)给出序列[1, 2, 3, 4]
默认步长为1
如果给range提供第三个数,则该数成为步长
如range(1,5,2)给出[1, 3]
(range的参数均为integer整数,从小到大)
range向上延伸到第二个数,即它不包含第二个数
else部分是可选的
如果包含else,则总是在for循环结束后执行一次,除非遇到break
(即若遇到break则直接退出for循环,并且不会执行else语句)
while
1 | while 条件为真: |
while语句有一个可选的else从句(其实是多余的)
break
break语句是用来终止循环语句的,即哪怕循环条件没有称为False或序列还没有被完全递归,
也停止执行循环语句
如果从for或while中终止,任何对应的循环else块将不执行
continue
continue语句被用来告诉Python跳过当前循环块中的剩余语句,然后继续进行下一轮循环。
函数
函数通过def关键字定义1
2def functionname(a, b, c, ...):
funciton body
调用函数 functionname(x1, x2, x3, …)
函数形参
参数在函数定义的圆括号对内指定,用逗号分割。
局部变量
在函数定义内声明的变量即为局部变量
所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始
global语句
为一个定义在函数外的变量赋值,用global告诉python这个变量名是全局的
可以使用定义在函数外的变量的值(假设函数内没有同名的变量),但不鼓励
eg(python3).
可以用一个global语句指定多个全局变量
1 | #!/usr/bin/python |
输出
1 | x is |
默认参数值
对一些函数,希望它的参数是可选的。如果用户不想为这些参数提供值则这些参数使用默认值。
在函数定义的形参名后加上赋值运算符=和默认值,从而给形参指定默认参数值
应该最后声明有默认值的形参(因为赋给形参的值是根据位置而赋值的)
关键参数
函数有许多参数,可以通过命名来为一部分参数赋值,即关键参数
使用名字(关键字)而不是位置来给函数指定实参
优势:
- 不必担心参数的顺序
- 假设其他参数都有默认值,可以只给我们想要的那些参数赋值
return语句
return语句用来从一个函数返回,即跳出函数。也可选从函数返回一个值
没有return等价于return None
Docstrings
文档字符串
在函数的第一个逻辑行的字符串是这个函数的文档字符串
惯例:
一个多行字符串,首行以大写字母开始,句号结尾,第二行是空行,第三行开始详细的描述
可以使用function.__doc__(双下划线)调用函数的文档字符串属性
help()所做的就是抓取函数的__doc__属性并展示
模块
想在其他程序中重用很多函数,则可以使用模块
模块基本上是一个包含了所有定义的函数和变量的文件,模块的文件名必须以.py为扩展名(为了在其他程序中重用模块)
使用模块: import 模块名
使用变量: 模块名.变量名
字节编译的.pyc文件
使输入模块更快
from … import
from sys import argv 直接输入argv变量到程序中from sys import* 输入所有sys模块使用的名字
模块的__name__
每个模块都有一个名称,模块中可以通过语句找出模块的名称
应用场景:只想在程序本身被使用时运行主块,而在它被别的模块输入的时候不运行主块1
if __name__ == '__main__'
- 如果模块的__name__是‘__main__‘,则说明这个模块被用户单独运行
制造自己的模块
每个python文件就是一个模块,确保其拓展名为.py
注意import和from … import在使用模块上的不同
dir函数
可以使用内建的dir函数列出模块定义的标识符。标识符有函数、类和变量
- 为dir提供一个模块名,它返回模块定义的名称列表
- 不提供参数,返回当前模块定义的名称列表
数据结构
python中有三种内建的数据结构
- 列表
- 元组
- 字典
列表list
每个项目之间用逗号分割
列表的项目包括在方括号内
可以添加、删除、搜索列表中的项目(列表是可变的数据类型)
对象与类
列表是使用对象和类的一个例子
当使用变量 i 并给它赋值时,可以认为创建了一个类(类型)int的对象(实例)i。
类有方法,即仅仅为类而定义的函数。仅在你有一个该类的对象的时候,才可以使用这些功能
python为list类提供了append方法,这个方法可以在列表尾添加一个项目
如:mylist.append('an item')
类有域,它是仅仅为类定义的变量
仅在有一个该类的对象时才能使用这些变量/名称,如mylist.field
使用列表
定义一个列表shoplist = ['apple', 'mango', 'carrot', 'banana']
获得列表元素个数len(shoplist)
打印列表print shoplist
使用for … in 在列表中各项目间递归(列表也是一个序列)
``
元组
不能修改元组
元组通过圆括号中用逗号分隔的项目定义
只含有一个元素的元组:需要在单个项目后面跟一个阔后,从而区分元组和表达式中一个带圆括号的对象singleton = (2,)
元组与打印语句
print语句可以使用跟着%符号的项目元组的字符串
%后有多个项目时需要加圆括号(元组形式)
%后只有单个项目时不需要圆括号
字典
把键和值联系在一起
键必须是唯一的
只能使用不可变的对象(如字符串)来作为字典的键
可以把不可变或可变的对象作为字典的值
eg.d = {key1 : value1, key2 : value2 }
字典中的键/值没有顺序
字典是dict类的实例/对象
序列
列表、元组和字符串都是序列
序列的两个特点:
- 索引操作符 从序列中抓取一个特定项目
- 切片操作符 获取序列的切片,即一部分序列
索引可以是负数,位置从序列尾开始计算,最后一个元素下标为-1
切片操作符是序列名后跟一个方括号,方括号内有一对可选的数字,冒号分割(数可选,冒号必须)
切片操作符中的第一个数表示切片开始的位置,第二个表示在哪里结束
不指定第一个数则从序列首开始
不指定第二个数则停止在序列尾
开始位置包含在序列切片内,结束位置排斥在切片外
可以用相同方法访问元组、列表、字符串
引用
创建一个对象并给它赋一个变量时,这个变量仅仅引用那个对象,并不是表示对象本身
即变量名指向计算机存储那个对象的内存,这称作名称到对象的绑定
即需要注意:
- 要复制一个序列或其他对象,必须使用切片操作符来拷贝(获得两份独立的序列)
- 直接使用赋值时,两个名称都引用一个对象,即两个名称都指向一个唯一的序列(赋值不创建拷贝)
其他字符串内容
在程序内使用的字符串都是str类的对象
字符串的方法
测试字符串是否以给定字符串开始stringname.startswith('xxxx')
检验给定字符串是否为另一个字符串的一部分if 'xxx' in stringname
找出给定字符串在另一个字串中的位置(首字母下标),找不到返回-1stringname.find('xxx')
str类有以一个作为分隔符的字符串join序列的项目的整洁的方法,返回一个生成的大字符串1
2
3delimiter = '_*_'
mylist = ['a','b','c','d']
delimiter.join(mylist)




