一.Python基本语法
1.1整数,实数,复数
前言:
Python编程环境及方法
- 在python底层环境中唤醒python对话,直接在python中输入指令对系统进行命令编程
- 随意打开一个记事本或其他编程工具,在其中按照python编程书写规范书写完全部代码后将文件另存为.py文件,之后再放入python环境中去运行修改。
(1)整数
int通常被称为整型或整数,是正、负整数,不带小数点。在利用运算符对整数进行计算时,如果不做数据类型的相应转换,所得的结果也是整型数值。在进行除法运算时,有时可能会产生除不尽的情况,这时如果只想得到整数的结果,丢弃可能的分数部分,可以使用地板除(//)。当两数进行相除运算时,即使除不尽,整数的地板除(//)结果也只会取商,并且永远都是整数。
在Python中,有三种除法(除法,地板除,模运算),一种除法是/:
>>> 10 / 3
3.3333333333333335
/除法计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数:
>>> 9 / 3
3.0
还有一种除法是//,称为地板除,两个整数的除法仍然是整数:
>>> 10 // 3
3
整数的地板除//永远是整数,即使除不尽。要做精确的除法,使用/就可以。
因为//除法只取结果的整数部分,所以Python还提供一个余数运算,可以得到两个整数相除的余数:
>>> 10 % 3
1
无论整数做//除法还是取余数,结果永远是整数,所以,整数运算结果永远是精确的。
(2)实数
实数,在Python语言中称为浮点型数据,浮点型由整数部分与小数部分组成,也可以使用科学计算法表示。整数和浮点数在计算机内部存储的方式不同,整数运算永远是精确的,而浮点数运算可能会有四舍五入的误差。和整数运算类似,实数在做地板除和求余时,也会产生相应结果,但是需要注意的是,得到的结果都是浮点型的。
(3)复数
复数在Python语言中的数据类型名称就是复数,复数由实数部分和虚数部分构成,可以用a+bj或complex(a,b)表示,复数的实部a和虚部b都是浮点型。Python支持复数,在应用数学中,复数的表达式为a+bi,而在Python语言中,用j代替了i,它的复数形式为a+bj,其中a和b都是float类型数字,j后缀表示虚数部分,不加j的表示实数部分。
a+bj和bj+a表示的是同一个复数。例如:
c = a + bj
c.real = a表示取复数的实数部分,c.imag = b表示取复数的虚数部分。
另外Python语言中可以自动输出一个共轭函数conjugate()。
运行结果如下:
>>> c = 1.1 +2.2j
>>> print(c)
(1.1+ 2.2j)
>>> print(c.imag)
2.2
>>> print(c.conjugate( ))
(1.1 - 2.2j)
(4)数据类型之间的相互转换
有时需要对数据内置的类型进行转换,只需将数据类型作为函数名即可。
数据的类型转换时有如下4个函数可以使用:
将x转换为一个整数
将x转换为一个浮点数。
将x转换为一个复数,实数部分为x,虚数部分为0。
将x和y转换为一个复数,实数部分为x,虚数部分为y。x和y是数字表达式
也可以将两种转换嵌套来进行,例如,把int函数放入float函数中:
float(int(352.1))
得出结果:352.0。
这里先把352.1取整,得到整数352,再用float将352转换成浮点数352.0,这样就得到需要的结果了。这其实是函数的嵌套,后面会集体介绍,这里做相关了解。
1.2字符串
字符串是Python中最常用的数据类型,它的数据类型不可变并有很多内置的方法。字符串是由数字、字母、下划线组成的一串字符。一般记为
(1)字符串的基本操作
字符串是Python中最常用的数据类型。可以使用引号('或")创建字符串。创建字符串很简单,只要为变量分配一个值即可。所有的标准序列操作(如索引、分片、成员资格、长度、最小值和最大值等)对字符串同样适用。
下面通过PyCharm来介绍下字符串是不可变的,写入如下代码并执行:
>>> msg = 'my name is awei'
>>> print(msg[-3:])
wei
>>> msg[-3:] = 'hao'
Traceback (most recent call last):
File”<stdin>”,line 1,in <module>
TypeError:’str’object does not support item assignment
要想实现输出两行字符串该怎么操作呢?在string_test1.py里输入如下代码并执行:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
print('my age is\n 25')
输出结果为:
my age is
25
结果输出为两行,这里使用了转义字符\n,表示换行。
如果想直接输出换行符而不对换行符进行转义,则加上一个“r”就行,示例如下:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
print(r'my age is\n 25')
输出结果为:
my age is\n 25
Python中有很多转义符,下表中列出了一些常用的转义字符。如表2.1转义字符所示。
表2.1 转义字符
转义字符 | 功能 |
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\’ | 单引号 |
\” | 双引号 |
\a | 响铃 |
\b | 退格 |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数yy代表的字符,例如:\o12代表换行 |
\xyy | 十进制数yy代表的字符,例如:\x0a代表换行 |
\u | 将转义字符右侧的十六进制数转化为对应的Unicode字符 |
如果想要输出三行带有单引号的字符串,就要用到上图中所用到的\\'转义字符,输入如下代码并执行:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
print('\'qianjia\'\n\'is the best company\'\n\'in the world\'')
可知,使用\\'转义字符得到了想要的结果。
'qianjia
'is the best company
'in the world
(2)格式化字符串
格式化字符串,即令字符串按照编程者想要的形式进行输出,常用的格式化字符串的方法指令有使用操作符百分号(%)进行输出。
下图提供了字符串格式化符号。如表2.2字符串格式化符号所示。
表2.2 字符串格式化符号
符号 | 功能 |
%c | 格式化字符及其ASCⅡ码 |
%s | 格式化字符串 |
%d | 格式化整数 |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | %f和%e的简写 |
%G | %f和%E的简写 |
%p | 用十六进制数格式化变量的地址 |
(3)字符串方法
Python提供了多种字符串方法来方便编程人员对字符串实现多种操作,方法简介如下:
方法用于检测字符串中是否包含子字符串str。
方法用于将序列中的元素以指定字符连接成一个新字符串
方法用于将字符串中所有大写字符转换为小写。
方法用于将字符串中的小写字母转换为大写字母。
方法用于对字符串的大小写字母进行相互转换
方法把字符串中的old(旧字符串)替换成new(新字符串)
方法通过指定分隔符对字符串进行切片
方法用于移除字符串头尾指定的字符(默认为空格),
方法根据参数table给出的表(包含256个字符)转换字符串的字符,将要过滤的字符放到del参数中。
1.3常用容器类型
Python提供多种数据结构来存放数据项集合,在Python中,有几种用来表示不同容器类型或序列的类型,包括列表、元组、字符串、字典、集合等。
(1)列表和元组
列表是重要的Python内置可变序列之一,它是包含若干元素的有序连续内存空间。列表方法的调用方法为:对象.方法(参数)。由此可知,方法的定义方式是将对象放到方法名之前,两者之间用一个点号隔开,方法后面的括号中可以根据需要带上参数。除了语法上有一些不同,方法调用和函数调用很相似。当列表增加或删除元素时,列表对象自动进行内存的扩展或收缩,从而保证元素之间没有缝隙。Python列表的这个内存自动管理功能可以大幅度减少程序员的负担,但是插入和删除非尾部元素时会涉及到列表中大量元素的移动,效率较低。并且对于某些操作可能会导致意外的错误结果。因此除非确实有必要,否则应尽量从列表尾部进行元素的增加或删除,这不仅可以大幅度提高列表处理速度,还可以总是保证得到正确结果。
在Python中,同一个列表的元素的数据类型可以各不相同,可以同时分别为整数、实数、字符串等基本类型,或者也可以是列表、元组、字典、集合、以及其他自定义类型的对象。
下面通过PyCharm来介绍下通过编号取元素的例子,示例代码如下:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
names = ['awei', "xiaohao", 'ludashi','happy','perfect']
print(names[0])
print(names[2])
print(names[-1])
print(names[-2])
输出结果:
awei
ludashi
perfect
happy
Python 的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
>>>tup1 = ('Google', 'Runoob', 1997, 2000);
>>> tup2 = (1, 2, 3, 4, 5 );
>>> tup3 = "a", "b", "c", "d"; # 不需要括号也可以
>>> type(tup3) <class 'tuple'> #type()方法用于展示tup3的数据类型
创建空元组
tup1 = ();
Ps:元组中只包含一个元素时,需在元素后面添加逗号,否则括号会被当作运算符使用。
序列操作包括索引,分片,序列相加相乘,in运算,求长度,最大值,最小值等,序列方法包括append()方法、count()方法等,在第三章会进行详细的介绍,在这里就先略过了。
前面提到列表和元组的区别在于元组(元组赋值形式:的元素不能修改,元组一旦初始化就不能修改。不可变的元组有什么意义?因为元组不可变,所以代码更安全。如果可能,能用元组代替列表就尽量用元组进行程序的相关编写。
(2)字典
字典是一种无序可变容器类型,还是Python语言中唯一的映射类型,字典中的“键”可以是Python中任意不可变数据,但是不可以使用列表、集合、字典、或者其他可变类型作为字典的“键”,另外,字典中的“键”不允许重复,而“值”是可以重复的。和序列类型的键有明显区别的是,映射类型的键可以直接或者间接地和存储数据相关联。并且映射类型的数据是无序排列的,而序列类型是以数值序排列的。同时还需要注意的是,字典和列表在工作效率上有所差别,字典的查找和插入的速度极快,不会随着key的增加而变慢,并且字典需要占用大量内存,内存浪费比较多。而列表在操作时,查找和插入的时间随着元素的增加而增加。并且它占用空间小,浪费的内存比较小。
字典具有修改字典,向字典添加新内容,增加新键/值对,修改或删除已有键/值对等基本操作方式,而字典的基本方法有clear()方法,copy()方法,fromkeys()方法,get()方法等。
字典是由多个键及其对应的值构成的对组成的(一般把键/值对称为项)。字典里的每个键/值(key/value)对用冒号(:)分割,每个项之间用逗号(,)分割,整个字典包括在花括号({})中。空字典(不包括任何项)由两个大括号组成,如{}。需要注意的是,在创建字典时,不允许同一个键出现两次,如果在创建时同一个键被赋值两次,则系统只会将后面出现的值赋给这个键并进行记录,然后将前面的值忽略掉。键必须是不可变的,可以用数字、字符串或者元组充当,但是不可以用列表充当键。字典的创建格式如下:
d={key1:value1,key2:value2}
还可以通过dict()函数利用其他映射(比如其他序列)或者键/值序列对来建立字典。通过dict()函数创建字典的指令格式示例如下:
>>> Kee = [('name','kee'),('sex','girl')]
>>> student = dict(Kee)
也可以利用dict()函数通过关键字创建字典,此种创建方法的语法示例如下:
>>> Kee = dict(name = 'kee',sex = 'girl')
如果想要对字典中的项进行删除,可以利用del命令,del命令不仅可以删除字典中的某个项,还可以删除整个字典,当删除字典之后就不能对字典进行访问了,此时访问系统就会报变量没有定义的错误。此命令的语法格式如下:
>>> Kee = {'awei': '1001', 'xiaohao': '1002', 'dashi': '1003', 'dabo': '1004'}
>>> del Kee['dabo'] #删除Kee字典中的'dabo'键
>>> del Kee #删除字典Kee
(2.1) 访问元素值
这里介绍使用下标运算符访问元素值的用法。字典中的每个元素表示一种映射关系或对应关系,根据提供的“键”作为下标就可以访问对应的“值”。如果字典中不存在这个“键”则会抛出异常。此种方法的命令格式示例如下:
>>> Kee = {'awei': '1001', 'xiaohao': '1002', 'dashi': '1003', 'dabo': '1004'}
>>> Kee['awei'] #指定键存在,返回对应的值
'1001'
>>> Kee['awe'] #指定键不存在,抛出异常
Traceback (most recent call last):
File”<pyshell#26>”,line 1,in <module>
Kee['aew']
KeyError:'awe'
>>> assert'awe' in Kee,'Key”awe” not in dict
Traceback (most recent call last):
File”<pyshell#44>”,line 1,in <module>
assert'awe' in Kee,'Key”awe” not in dict
AssertionError:Key “awe” not in dict
为了避免程序运行时引发异常而导致程序崩溃,在使用下标的方式进行访问字典元素时,最好能配合条件判断或者异常处理,例如:
>>> Kee = {'awei': '1001', 'xiaohao': '1002', 'dashi': '1003', 'dabo': '1004'}
>>> if'awe' in Kee
print(Kee['awe'])
>>> else:
print('Not Exists')
Not Exists
>>> try: #使用异常处理结构
print('Kee['awe']')
>>> except:
print('Not Exists')
Not Exists
(2.2) 添加元素、修改元素值
修改字典,向字典中添加新内容的方法是增加新键/值对,修改已有键/值对。可以利用赋值符号等号(=)来对字典进行添加元素,修改元素值得操作。示例代码如下:
>>> student = {'awei':'1001','xiaohao':'1002','dashi':'1003'}
>>> student['dashi']='1005'
>>> print('dashi的学号是: %(dashi)s' % student)
dashi的学号是:1005
>>> student['dabo']='1006'
>>> print('dabo的学号是: %(dabo)s' % student)
dabo的学号是:1006
(3)集合
在Python语言中,集合专指可变集合(set())和不可变集合(frozenset)两种,而比较常用的就是set集合了。set和其他语言类似,是一个无序不重复元素集,基本功能包括关系测试和消除重复元素。集合对象还支持union(并)、intersection(交)、difference(差)和sysmmetric difference(对称差集)等数学运算。本章会重点介绍下set集合。集合的方法有以下几种:
:测试是否 s 中的每一个元素都在 t 中;
:测试是否 t 中的每一个元素都在 s 中;
:返回一个新的 set 包含 s 和 t 中的每一个元素;
:返回一个新的 set 包含 s 中有但是 t 中没有的元素;
:返回一个新的 set 包含 s 和 t 中的公共元素;
:返回一个新的 set 包含 s 和 t 中不重复的元素。
想要使用集合,首先就要学会如何创建集合。
集合(set)拥有类似字典(dict)的特点:可以用{}花括号来定义;set集合是无序的,类似于列表、字典、字符串等这类可迭代的对象都可以作为集合的参数。set集合中的元素不可重复,这就类似dict的键。
set也有和列表(list)相似的特点,例如可以原处修改(事实上是一种类别的set可以原处修改,另外一种不可以)。
以一段代码为例,新建一个.py文件后输入以下代码:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
set1 = set('xiaohao')
set2 = set([123,'awei','xiaohao','liping','awei'])
set3 = {'awei',123}
print(set1)
print(set2)
print(set3)
a = set('abracadabra')
b = set('alacazam')
print(a)
print(a -b) # 集合a中包含而集合b中不包含的元素
print(a | b) # 集合a或b中包含的所有元素
print(a & b) # 集合a和b中都包含了的元素
print(a ^ b) # 不同时包含于a和b的元素
运行结果:
{'x’,’i’,’a’,’o’,’h’,’a’,’o'}
{[123,'awei','xiaohao','liping','awei']}
{'awei',123}
{'a', 'r', 'b', 'c', 'd'}
{'r', 'd', 'b'}
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
{'a', 'c'}
{'r', 'd', 'b', 'm', 'z', 'l'}
运行完成后可知,set是一个无序不重复元素的序列, 基本功能包括关系测试和消除重复元素。
集合的基本操作包括添加项,删除项,显示集合的长度,测试等,而集合的方法有issubset()方法,union()方法等等,之后再做介绍。
2.2 变量
2.2.1 变量的定义与命名规则
在Python中,变量的使用环境非常宽松,没有明显的变量申明,而且类型不是固定的。使用者可以把一个整数赋值给变量,也可以把字符串赋值给变量。
在Python中,等号(=)是赋值符号,运用此符号可以把任何数据类型赋值给变量。假设现在有一个变量t,如果想要给它赋值为字符串类型数据test,那么赋值命令如下:
t = ‘test’
当声明一个变量时,可以选择有意义的名称作为变量名,由此来标记变量的用途。可以用数字或者字符组成的任意长度的字符串来对变量进行命名,但是需要注意的是,当命名变量时,必须以字母开头(无论大小写),并且Python语言是区分大小写的,所以可以利用大小写的不同来命名书写方式不同但有相似用途的变量。Python系统允许下划线(_)出现在变量名中,例如she_he就是一个合法的变量名。
在起名时要注意避开Python语言中的关键字,Python语言中一个有33个关键字都不能作为变量名来使用。这33个关键字如表2.3关键字列表所示。
表2.3 关键字列表
False | None | True | and | as | assert | break |
class | continue | def | elif | else | except | del |
finally | for | from | global | if | import | in |
nonlocal | lambda | is | not | or | pass | raise |
return | try | while | with | yield |
|
|
如果起名时不遵循以上这些命名规则,解释器就会报错并不允许程序运行,直至用户将变量名修改正确为止。
2.2.2 变量创建与删除
在Python中,变量的使用环境非常宽松,没有明显的变量声明,直接赋值即可创建各种类型的对象变量,并且变量的类型是可以随时发生改变的。这也是Python语言的优势之处。
在Python程序中,当创建声明一个变量时,可以不规定这个变量的数据类型而直接对这个变量进行赋值(必须进行赋值操作),然后在之后的程序中进行引用。虽然在使用之前不需要显式地声明变量类型,但是Python仍属于强类型语言,Python解释器会根据赋值或者运算来自动为变量选择数据类型。
当需要删除一个特定的自定义变量a时,需要运用到的命令是
del a
Python具有自动内存管理功能,并且它是采用基于值的内存管理方式,对于一个没有任何变量指向的值,Python会自动将其删除。Python会跟踪所有值并自动删除不再有变量指向的值。
2.3 基本输入输出
2.3.1 input()函数
在Python3中利用input()对控制台输入的内容进行读取的时候,不必刻意去注意输入的内容的类型,因为不管输入什么,input()函数都会将它当成字符串类型进行读取和保存,并在程序需要的时候返回这个字符串内容。
2.3.2 print()函数
和输入函数input()相对应的就是基本输出函数print()。
(1)输出字符串和数字
字符串和数值类型比较简单,均是可以直接输出的,输出格式如下:
>>> print(“No I just can’t get over you”)
No I just can’t get over you
>>> print(1)
1
(2)变量
无论变量是什么类型(数值,布尔,列表,字典···),print()函数都可以直接将它输出出来。以字典为例:
>>> Kee = {’a’:1,’b’:2}
>>> print(Kee)
{‘a’:1,’b’:2}
(3)格式化输出
print()函数支持参数格式化。当使用者需要输出一个参数时,可以在输出指令中自行规定这个参数的输出类型,以格式化输出字符串为例:
>>> Kee = ’teacher’
>>> kee = len(Kee)
>>> print(“The length of %s is %d “%(Kee,kee))
The length of teacher is 7
(4)默认换行
print()函数在循环输出时,会自动在行末加上回车来确认继续执行,并且print()函数语句总是默认换行的。因为print是一个内置函数,其形参中有默认参数和关键参数,所以在Python3中,如果想要不换行输出01234,可以这样操作print()函数:
# coding: UTF-8
for i in range(5):
print(i)
不做任何操作时输出结果如下:
将程序中的输出语句改编为:
print(i,end=' ')
即可输出不换行的语句形式,形式如下:
0 1 2 3 4