第二章 Python 基础知识
世界上大多数计算机语言是C-like语言,Python其基础语法与C语言非常相似。(莫名感觉学习C语言的重要性 .jpg)
基本语法
- 声明
(了解一下)
要为源文件指定特定的字符编码格式,需要在文件的首行或第二行插入一行注释,称为编码声明。这一声明必须放在首行或第二行的原因是:注释行都是以#号开头的,不会被机器编译。编码声明虽然不属于注释行,但同样以#号开头,可能会被机器误识别为注释,只有放在首行或第二行的位置,才能被机器正常识别并编译。编码声明的格式如下:
# -*- coding: utf –8 -*-
通过编写这一声明,源文件中的所有字符都被当作coding指代的UTF-8编码对待。
编写Python脚本时,除声明编码格式外,常常也会加上一个路径声明。路径声明的格式如下:
# !/usr/bin/Python
路径声明指出了系统执行py文件时,调用的是/usr/bin下的Python解释器。路径声明一般放在脚本首行。
- 注释
(注释是提高代码可读性的必要措施)
注释里的内容并不会参与编译,注释是对代码做出说明的文字。
单行注释以#号开头,#号后到换行之前的所有字符都是注释部分
#这是一个单行注释
多行注释时每行前均需要加上#号
#这是一个使用#号的多行注释
#这是一个使用#号的多行注释
也可使用3个单引号(’’’)或3个双引号("”””)将注释对象括起来。
'''
该多行注释使用的是3个单引号
该多行注释使用的是3个单引号
'''
"""
该多行注释使用的是3个双引号
该多行注释使用的是3个双引号
"""
- 缩进
(清晰的结构与严谨的逻辑相对应,虽然IDE会提供Reformat Code的选项)
代码首行的空白称为缩进可用4个空格或制表符创建。Python代码的一大特色就是用缩进的方式标识代码结构,而Java和C++等语言使用大括号{ }。
- 多行语句
用反斜杆(\)可以实现长语句的换行,且不会被机器识别成多个语句。
但在[ ]、{ }、( )等不同括号内,多行语句换行时不需要使用反斜杆(\),直接换行即可。
除了将一个语句拆分为多行外,Python也支持在一行中实现多个语句,使用分号(;)将短语句隔离。
- 保留字符
Python中的标识符是指变量、函数、类、模块及其他对象的名字,可以包含字母、数字和下划线(_),但必须以非数字字符开始。特殊符号,如$、%、@等,不能用在标识符中。
标识符对大小写敏感,比如“UFO”和“ufo”就是两个不同的对象。
保留字符即关键字,是编程语言中已经定义过的字符。输入查询保留字符的指令,即可获取保留字符名单。
import keyword ; print('Python中所有的保留字符为:\n',keyword.kwlist)
Python中所有的保留字符为:
['False', 'None', 'True', '__peg_parser__', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
- 赋值
Python中的赋值方式有四种,除最基本的赋值形式外,还有序列赋值、链接赋值和增量赋值等方式。
赋值的最基本形式是以等号(=)为连接,将要赋值的变量放在等号左侧,将要赋给的值放在等号右侧。
num_int = 20 ; num_float = 2.1 ; string= 'python'
print('这是基本形式的赋值:',num_int,num_float,'python')
这是基本形式的赋值: 20 2.1 python
序列赋值的基本形式是将多个变量排成变量序列,变量之间使用逗号相连,使用等号作为赋值符号,后接值序列,值之间用逗号相连。序列赋值在变量序列与值序列之间建立了依次映射的关系。
num_int,string,list1 = 123,'str',[4,6]
print('这是序列形式的赋值:',num_int,string,list1)
这是序列形式的赋值: 123 str [4, 6]
链接赋值的基本形式是将多个变量用等号相连,在末个变量后用等号连接一个赋值。链接赋值只适用于给多个变量赋予同一值的情况,又称为多目标赋值。
str1 = str2 = str3 = 'CODE'
print('这是链接形式的赋值:',str1,str2,str3)
这是链接形式的赋值: CODE CODE CODE
增量赋值,又称为增强赋值,其基本形式是将原始赋值语句改写,去掉赋值符号右侧变量,将赋值符号右侧运算符挪至符号左侧,形成新的运算式。增量赋值的优势在于可以减少输入代码的工作量。
x = 100; x+=10
print('这是增量形式的赋值:',x)
这是增量形式的赋值: 110
运算符
运算符是运算法则的具体体现。Python提供了算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、身份运算符和成员运算符7类运算符,从而实现了丰富多样的运算功能。
- 算术运算符
进行除法运算时,不管商为整数还是浮点数,运算结果始终为浮点数。要得到整型的商,需要用双斜杆做整除,且除数必须是整型的。对于其他的运算,只要任一运算数为浮点数,运算结果就是浮点数。
算术运算符 | 说明 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法或返回一个被重复若干次的字符串 |
/ | 除法 |
% | 取模,返回除法的余数 |
** | 幂,返回幂次 |
// | 整除,返回商的整数部分 |
- 赋值运算符
赋值运算符 | 说明 |
---|---|
= | 赋值运算 |
+= | 加法赋值运算 |
-= | 减法赋值运算 |
*= | 乘法赋值运算 |
/= | 除法赋值运算 |
%= | 取模赋值运算 |
**= | 幂赋值运算 |
//= | 取整除赋值运算 |
- 比较运算符
Python中的字符使用ASCALL编码,每个字符都有属于自己的ASCALL码,字符比较的本质是字符ASCALL码的比较
比较运算符 | 说明 |
---|---|
== | 比较对象是否相等 |
!= | 比较对象是否不等 |
> | 表示大于比较 |
< | 表示小于比较 |
>= | 表示大于等于比较 |
<= | 表示小于等于比较 |
- 逻辑运算符
逻辑运算即判断事物之间的“与”“或”“非”关系
逻辑运算符 | 说明 |
---|---|
and | 与 |
or | 或 |
not | 非 |
- 按位运算符
(详情须了解二进制编码规则)
按位运算符 | 说明 |
---|---|
& | 按位与,参与运算的两个值相应位都为1,则该位的结果为1,否则为0 |
| | 按位或,对应的二进制位有一个为1,结果位就为1 |
^ | 按位异或,两个对应的二进制位相异时,结果为1 |
~ | 按位取反,把1变为0,把0变为1 |
<< | 左移,由“<<”右边的数指定移动位数,高位丢弃,低位补0 |
>> | 右移,“>>”左边运算数的二进制位全部右移,“>>”右边的数指定移动的位数 |
- 身份运算符
身份运算符用于比较两个对象的存储单位,当a、b获取到一样的值时,两个变量就获取同样的内存地址。
身份运算符 | 说明 |
---|---|
is | 判断两个对象的存储单位是否相同 |
not | 判断两个对象的存储单位是否不同 |
- 成员运算符
成员运算符的作用是判断某个指定值是否存在某一序列中,包括字符串、列表和元组。
成员运算符 | 说明 |
---|---|
in | 在指定序列中找到指定值 |
not in | 在指定序列中没有找到指定值 |
- 运算符优先级
优先级从上往下依次降低,同一优先级的运算符按从左到右的顺序进行运算。
运算符 | 说明 |
---|---|
** | 指数 |
~ + - | 按位翻转,一元加号和减号(+@和-@) |
* / % // | 乘、除、取模和取整除 |
+ - | 加法、减法 |
>> << | 右移、左移运算符 |
& | 位“AND” |
^ | | 位运算符 |
<= <> >= | 比较运算符 |
<> == != | 等于运算符 |
= % = /= //= -= += *= **= | 赋值运算符 |
is is not | 身份运算符 |
in not in | 成员运算符 |
and or not | 逻辑运算符 |
数据类型
- number
将int转换为二进制、八进制和十六进制数,分别需要通过bin函数、oct函数和hex函数进行创建或转换。
由于bool值继承了int类型,所以可直接用于数学运算,True = 1,False = 0。
通过type函数可以判断对象的数据类型。
不同的number类型通过函数可以相互转换,使用代表number类型的函数即可。也可以进行混合运算,运算时自动转换成同一类型,然后再进行运算。转换遵守一定的方向:int向float转换,非complex向complex转换。
整数类型 | 举例 |
---|---|
整数 int | 1、10、100 |
浮点数 float | 15.20、-21.9、30.1+e18 |
复数 complex | 3.14j、45.j、9322e-36j |
布尔值 bool | 0、1 |
- str
字符串类型。创建一个str,除字符外,还要在字符序列的首尾加上引号。使用单引号(’)、双引号(’’)是等效的,但需要保证str两端的引号类型相同。
如果要指定一个多行的str,则需要使用三引号(’’’)。str支持索引, “变量[下标]”索引单个数值,“变量[头下标:尾下标]”能够进行切片。
字符串str还有丰富的查询和改写操作函数等。
str = 'YouCanLearnPython'
print('YouCanLearnPython[6:11] = ',str[6:11])#从第7个字符开始索引,到第12个字符
print('YouCanLearnPython[-11:-6] = ',str[-11:-6])#从倒数第11个字符开始索引,到倒数第6个字符
print('YouCanLearnPython[:5] = ',str[:6])#从第1个字符开始索引,到第7个字符
print('YouCanLearnPython[6:] = ',str[6:])#从第7个字符开始索引,到最后一个字符截止
print('YouCanLearnPython[1:10:4] = ',str[1:10:4])#从第2个元素开始索引,到第11个元素,步距为4
print('YouCanLearnPython[::-1] = ',str[::-1])#反向索引
YouCanLearnPython[6:11] = Learn
YouCanLearnPython[-11:-6] = Learn
YouCanLearnPython[:5] = YouCan
YouCanLearnPython[6:] = LearnPython
YouCanLearnPython[1:10:4] = onr
YouCanLearnPython[::-1] = nohtyPnraeLnaCuoY
- list
列表,属于序列类数据,是包含0或多个对象引用的有序序列。由于list中所有的数据项都是对象引用,因此list可以存放任意数据类型的数据项,既可以是int、float、str等这种基础数据类型,也可以是list、tuple、dict等这一类的复合数据类型。
list可以使用方括号“[ ]”:空的方括号创建空的list;包含多个项的list可以在方括号中使用逗号分隔的项序列创建。也可以通过list函数创建,list函数最多接受一个参数; 不带参数调用函数时返回空list; 带参数时返回参数的浅拷贝(在有指针的情况下,浅拷贝只是增加了一个指针,指向已经存在的内存);对复杂参数(非基本元素,如复合数据类型)则尝试将给出的对象转换为list。
list方法 | 函数 |
---|---|
定位某个匹配项 | list.index() |
指定位置插入元素 | list.insert() |
将一个list扩展至另一list | list.extend() |
按对象删除list中的第1个匹配项 | list.remove() |
对原list进行排序 | list.sort() |
统计list中某个元素出现的次数 | list.count() |
追加元素元素至list末尾 | list.append() |
按位置删除list中的元素 | list.pop() |
反向排序list元素 | list.reverse() |
- tuple
元组,tuple是包含0个或多个对象引用的有序序列。与list不同的是,tuple是不可更改的数据类型。
tuple可以用圆括号()创建:空的圆括号创建空的tuple;包含一个或多个项的tuple可以使用逗号分隔开元素;如果tuple内只包含一个元素,需要在元素后加上逗号予以区分。有时,tuple必须被包含在圆括号中以避免语义二歧性。例如,要将tuple(1,2,3)传递给一个函数,应该写成function((1,2,3))的形式,以免被识别成“1,2,3”这三个数字变量。
与list不同的是,tuple中的元素无法做增删操作,只能用del函数删除整个tuple。
tuple方法 | 函数 |
---|---|
计算某一元素在tuple中出现的次数 | tuple.count() |
找出某一元素在tuple中首次出现的位置 | tuple.index() |
- dict
dict又称字典,属于映射类数据。Dic通过键而不是位置来索引,键是不可变对象(如number、str、tuple)的对象引用,值是可以指向任意类型对象的对象引用。同一个键不允许出现两次,创建dict时如果同一个键被赋值两次,只有后一个值会被记住。
dict可以用花括号{ }创建:使用空的花括号创建空的dict; 非空的花括号包含一个或多个逗号分隔的项,每个项包含一个键、一个冒号以及一个值。
用{ }创建
dict1 = {}
dict1['one'] = 'This is 1'
dict1['two'] = 'This is 2'
print('查看字典:',dict1)
查看字典: {'one': 'This is 1', 'two': 'This is 2'}
用dict()函数创建
dict2 = dict(name = '小明', height = 187)
print('查看字典:',dict2)
查看字典: {'name': '小明', 'height': 187}
- set
Python中有两种内置集合类型:set(可变集合)和frozenset(不可变集合)。set是引用零个或多个对象的无序组合,所引用的对象都是不可变的,所有内置的固定数据类型(如float、frozenset、int、str、tuple)都是不可变的。
set可以使用花括号{ }或set函数创建。使用花括号{ }创建集合使用{ }包裹一个或多个项,项与项间用“ ,”分割;空的set无法用{ }创建。
set是可变的,但由于其中的项是无序的,因此没有索引的概念。set可变而无法索引,这使得它无法通过查询和修改元素的操作,但仍旧支持元素的删改,并可以清空和拷贝。set的常用操作基本都需要通过内置方法。
(数据类型的特点是为数据类型的功能而服务的)
Python I/O
-
input:
Python3中的input函数默认接受数据都为str 。 变量名 = input(" ") -
print:
print函数可以接收多个str,并需要用逗号隔开,print函数会依次打印每个str,遇到逗号则输出一个空格,因此输出的str是拼起来的。
print函数也可以自动计算结果,如运行“print(number1+number2)”语句。用format函数可参与格式化输出。 -
文件I/O
文件I/O函数 | 形式 |
---|---|
open函数 | open(filename,mode) |
read函数 | f = open(filename,mode); f.read(size) |
write函数 | f = open(filename,mode); f.write(str) |
close函数 | fileObject.close() |
第二章课后题概述
-
A
多行注释除了使用#号外,也可以使用引号,但需保持前后三个引号的类型一致; 在代码中添加注视是为了提高代码的可读性 -
D
除加减乘除外,还有取模%、幂**和取整除// ;“=”表示赋值,“==”表示比较是否相等; or“一者为真即为真” -
C
str是可变的数据类型,内置方法丰富; list.pop是按位置删除list中的元素; dict通过键而不是位置来索引 -
A
Python3中主要的整数数据类型只有int,不再保留long; Python并不支持查询str中某个字符的位置; list可以存放任意数据类型,这是因为其内部的数据项都是对象引用; set引用的对象只能是不变的,其是引用零个或多个对象的无序组合。 -
B
open函数的只读打开时是r模式,w模式表示“打开一个文件用于写入,如果该文件已存在则将其覆盖,若不存在则创建新文件”; write函数可将任何str写入打开的文件,其中的str可以是二进制数据,而不限于文字; 要写入str以外的内容,要先将写入的内容转化为str; 用close函数关闭文件,是为了信息的完整。
-
填空题
(1)实现多行语句用 \ 即可,但在[ ]、{ }、()内的长语句以逗号结尾,直接换行即可。
(2)同一优先级运算符的运算顺序是从左到右。
(3)str内置方法的功能集中在查询和改写两个方面。
(4)dict无法使用str式的索引格式,但支持以键查值的形式。
(5) 文件在读写操作后必须用close函数关闭文件,以避免信息保存的不完整。
-
判断运算结果区间
# 判断6的3次方除以4的计算结果是否在列表[18, 20, 54]中
print('6的3次方除以4,结果在[18, 20, 54]中:', 6 ** 3 / 4 in [18, 20, 54])
6的3次方除以4,结果在[18, 20, 54]中: True
- 创建列表
# 创建列表
#方法1:[]创建
list1 = [10086, 10000, 10010, '中国移动', '中国电信', '中国联通']
#方法2:list函数创建
list2 = list((10086, 10000, 10010, '中国移动', '中国电信', '中国联通'))
print('list1:', list1)
print('list2:', list2)
print('list1和list2的类型分别为:', type(list1), type(list2))
list1: [10086, 10000, 10010, '中国移动', '中国电信', '中国联通']
list2: [10086, 10000, 10010, '中国移动', '中国电信', '中国联通']
list1和list2的类型分别为: <class 'list'> <class 'list'>
- 创建元组
# 创建元组
#方法1:()创建
tuple1 = ('China', 'Chinese', 960, 56, '中国')
#方法2:tuple函数创建
tuple2 = tuple(['China', 'Chinese', 960, 56, '中国'])
print('tuple1:', tuple1)
print('tuple2:', tuple2)
print('tuple1和tuple2的类型为:', type(tuple1), type(tuple2))
tuple1: ('China', 'Chinese', 960, 56, '中国')
tuple2: ('China', 'Chinese', 960, 56, '中国')
tuple1和tuple2的类型为: <class 'tuple'> <class 'tuple'>
- 创建字典
# 创建字典
#方法1:{}创建
dict1 = {'中国': 'China', '美国':'America'}
#方法2:dict()函数创建
dict2 = dict(中国='China', 美国='America')
print('dict1:', dict1)
print('dict2:', dict2)
print('dict1和dict2的类型为:', type(dict1), type(dict2))
dict1: {'中国': 'China', '美国': 'America'}
dict2: {'中国': 'China', '美国': 'America'}
dict1和dict2的类型为: <class 'dict'> <class 'dict'>
- 创建集合
# 创建集合
#方法1:{}创建
set1 = {'China', 'America', 'Russia', 'Germany', 'France'}
#方法2:set函数创建
set2 = set(['China', 'America', 'Russia', 'Germany', 'France'])
print('set1:', set1)
print('set2:', set2)
print('set1和set2的类型为:', type(set1), type(set2))
set1: {'America', 'Germany', 'Russia', 'China', 'France'}
set2: {'Germany', 'Russia', 'France', 'China', 'America'}
set1和set2的类型为: <class 'set'> <class 'set'>
(综上可见,创建方法都是符号创建加函数转换这两大类)
- 读取文件操作
# 读取 txt 文件内容,存到 content1 变量中
f = open('C:\\Users\\Lenovo\\Desktop\\test.txt','r')
content1 = f.read()
print('原文件内容:', content1)
f.close()
原文件内容: 10×10
f = open('C:\\Users\\Lenovo\\Desktop\\test.txt', 'a+')
# 追加解答结果
f.write('=100')
f.close()
注:代码除部分经本人修改外,主要来自 机械工业出版社的《Python3智能数据分析快速入门》 的配套资料。