1.语法基础
1.1 代码注释
单行注释:单行注释可以出现在源代码中任意位置,如 # 注释内容;
多行注释:使用3个引号包含注释内容,注释一般位于程序的开头或者代码块的开头,用于对Python模块、类、函数等添加说明。
注:代码块主要包括程序结构(如分支结构、循环结构)、函数体、类结构、异常处理和上下文管理等。
''' 注释内容''' """ 注释内容 """
1.2 代码缩进
采用冒号+缩进。
缩进可以使用空格键、Tab键表示,一个Tab键默认4个空格宽度,一般建议使用4个空格表示一个层级的缩进宽度。
''' 命令行: 缩进代码块 嵌套命令行: 嵌套代码块: ...... 嵌套代码块结束 ...... 缩进代码块结束 ''' while True: # 无限循环 name = input('你叫什么名字?') # 要求输入姓名 if name: print(f'Hello {},欢迎学习Python。') break # 结束循环 else: # name为空,没有输入则返回提示输入 print(f'不要匿名哦!\n{"-"*50}') continue # 返回继续询问
1.3 代码行
一行代码表示一条语句,这里的行是逻辑行,而非物理行。
- 物理行:通过回车符(CR)或者换行符(LF)终止,在嵌入式源代码中则通过’\n‘ 终止。
- 逻辑行:表示一条语句,通过NEWWLINE(新行)形符终止。
一般情况下,一个物理行就是一个逻辑行。也可以多个物理行构成一个逻辑行,这样一条语句可以分成多行显示。
显示连接:在一个物理行的末尾添加续行符(\),并且续行符后面不能符加任何代码,必须直接换行,行内也不能包含任何注释,其中的缩进也没有任何语法意义。
隐式连接:在小括号()、中括号、大括号内包含多行代码,不需要添加续行符,将自动视为一个逻辑行,并且可以添加注释。
hi = ('Hello', # 物理行1 ',', # 物理行2 'Python') # 逻辑行 print(hi) # 输出为 Hello,Python
如果多条相邻语句属于同一个代码块,可以合并物理行显示,语句之间用分号(;)分隔,一般不建议同一行内编写多条语句。
while True: name = input('你叫什么名字?') if name: print(f'Hello {},欢迎学习Python。');break # 代码块并行展示 else: print(f'不要匿名哦!\n{"-"*50}');continue # 局部两条语句合并 pass
1.4 空字符和空行
空字符表示各种不可见字符,如空格、Tab 字符、换行符等。这些空字符在逻辑行的开头具有语法意义,表示缩进。在字符串中具有实际字符的含义。但是,在其他位置,空字符没有任何语义,不会被解析,主要作用是区分不同的形符。1个空字符和10 个空字符没有本质区别,都具有相同的作用:分隔两个形符。例如,abe 表示1个形符,而a b c表示3个形符。
空行表示一个只包含空格符、制表符、进纸符或者注释的逻辑行。空行将被 Python 解析器忽略,不被解析。空行的作用:分隔两段不同功能的代码块,便于代码阅读和维护。例如,函数体、类结构、类方法之问可以使用空行分隔,表示一段新代码的开始。
1.5 形符
形符是各种名称、符号、字符序列或抽象概念的统称,主要包括:标识符、关键字、保留字、运算符、分隔符、字面值、NEWLINE(新行)、IVDENT(缩进)和DEDENT(突出)
标识符就是各种有效的名称,如关键字、保留字、变量、类、函数、方法等。标识符的第一个字符是字母或下面线 (_),其余部分由字母、数字或下画线组成。标识符的长度没有限制,对大小写敏感。
关键字是 Python 预定义的、具有特殊功能的标识符。使用keyword模块的 kwlist 集合可以查看当能 Python 版本支持的关键字。如下代码可查看关键字。
import keyword print(keyword.kwlist)
保留字以下画线开头或结尾,是包含特殊含义的标识符。
- _*:开头包含单下画线,表示模块私有名称。不会被from module import *导入。
- __*__:开头和结尾包含双下画线,表示Python 预定义名称,也称魔法变量或魔术方法。
- __*:开头包含双下画线,表示类的私有名称,仅在当前类中使用,不能在类外访问,也不能够被继承。
运算符就是执行各种运算的符号,如十、一、*、/、**、//、%、@。
分隔符不执行远算,仅表示语法分隔的作用,如小括号()、中括号[]、 大括号{}、逗号(,)、冒号(、)、点字(.)、分号(;)、单引号(‘)、双引号(“)、井号(#)、反斜杠(\)等。
2.数据类型
所有数据都是由对象或对象间关系来表示的。每个对象都拥有3个基本特性:
- 编号:ID省份标识。可以使用id(object)获取对象obj的id编号,编号为一组整型的数字。可以使用 id(a) == is(b) 或者 id(a) is id(b) 判断两个对象的编号是否相同。
- 类型:类型决定对象所支持的操作,并定义了该类型对象可能的取值。可以使用type(object)查看。
- 值:对象拥有的具体数据。值可以改变称可变对象,值不可改变称不可变对象。
a. 一个对象的可变性是有类型决定的。数字、字符串和元组是不可变的,而列表、字典和集合是可变的。
b.一个不可变容器对象如果包含对可变对象的引用,当后者的值改变时,前者的值也会改变。但是该容器仍属于不可变对象,因为它所包含的对象集是不会改变的。不可变并不严格等于值不能改变。
Python 内置类型可以分为2类,具体如下:
标淮数据类型:如数字(int、 float、 complex)、序列(list、tuple、range)、文本序列 (str)、二进制序列 (bytes、 bytearray、memoryview)、集合(set、frozenset)、映射(dict)、迭代器、上下文管理器等。
其他内建类型:包括模块、类和实例、函数、方法、类型(type)、空对象(None)、省略符对象、代码对象、布尔值、未实现对象、内部类型等。其中,内部类型包括栈帧对象、回湖对象、切片对象。
使用isinstance(object, type)函数能够检测一个值是否为指定类型的实例。参数 object 为一个对象,参数type为类型名(如int),或者是类型名的列表,如(int,int,float)。返回值为布尔值。
print(isinstance(1,int)) # 输出为 True print(isinstance(1,str)) # 输出为 False print(isinstance(1,(str,int,float))) # 输出为 True print(isinstance(1,(str,list,float))) # 输出为 False
type(object)函数可以返回对象的类型。
print(type(1)) # 输出为 <class 'int'> print(type(1.0)) # 输出为 <class 'float'> print(type('1')) # 输出为 <class 'str'> print(type(True)) # 输出为 <class 'bool'> print(type([1])) # 输出为 <class 'list'> print(type(range(1,2))) # 输出为 <class 'range'> print(type((1,1))) # 输出为 <class 'tuple'> print(type({1:1})) # 输出为 <class 'dict'> print(type({1,2})) # 输出为 <class 'set'>
注:如果判断两个类型是否相同,推荐使用isinstance()函数。
class A: pass class B(A): pass print(isinstance(A(),A)) # 输出为 True print(type(A()) == A) # 输出为 True print(isinstance(B(),A)) # 输出为 True print(type(B()) == A) # 输出为 False,但类型是一样的
3.变量
交量名字是有效标识行,第一个字行必须是字母或下画线(_),其余字符可以由字母、数字或下画线组成,并严格区分大小写。
变量名没有长度限制,但是不能使用Python关键字和保留字,也不建议使用Python内置函数,这样会导致内置函数被覆盖。
123_abc = 10 # 变量命名不合法,须以字母或下画线(_) if = 10 # if 是关键字,不能使用关键字命名
变量命名的一般方法是驼峰式命名法。包括如下两种形式。
小驼峰式命名法:第一个单词以小写字母开始,第二个单词的首字母大写。例如:firstName;
大驼峰式命名法:每一个单词的首字母都采用大写字母。例如:FirstName;
也可以使用下画线(_)连接多个单词,如 first_name;
在Python 中,不需要声明变量,也不需要定义变量类型,但是变量在使用前必须要赋值,然后才能使用。使用赋值运算符,直接把对象赋值给变量就可以定义一个变量。
链式赋值:同时给多个变量赋值;
解包赋值: 将容器的元素逐一赋值给多个元素。
# 链式赋值 a = b = c = "abc" # a、b、b都为'abe' # 解包赋值 a,b,c = 1,2,3 # 多变量赋值,a、b、c分别为1、2、3,其中1,2,3等价于(1,2,3) a,b,c = (1,2,3) # 元组解包,a、b、c分别为1、2、3 a,b,c = [1,2,3] # 列表解包,a、b、c分别为1、2、3 a,b,c = '123' # 字符串解包,a、b、c分别为1、2、3 a,b,c = {"a":1,"b":2,"c":3} # 字典解包,a、b、c分别为'a'、'b'、'c',只把对应键取出
注:如果遇到左边变量个数小于右边可选代对象中元素的个数时,可以在某个变量前添加星号前缀;
*a,b,c = [1,2,3,4] # a、b、c分别为 [1,2]、3、4] a,*b,c = [1,2,3,4] # a、b、c分别为 1、[2,3],4] a,b,*c = [1,2,3,4] # a、b、c分别为 1、2、[3,4] a,b,*c = [1,2] # a、b、c分别为 1、2、[]
4.数据类型-数字
数字类型有3种:整数(int)、浮点数(float)、和复数(complex),另外,布尔值(bool,0/1)也属于整数的子类型。
创建数字有两种方法:数字字面值、调用内置函数。
- 数字字面值;
# a.不能修饰的整数字面值,包括二进制、八进制、十进制和十六进制; n = 0b101 # 二进制数字,以0b开头 print(n) # 输出十进制数字 5 n = 0o23 # 八进制数字,以0o开头 print(n) # 输出十进制数字 19 n = 14 # 十进制数字,不能以0开头,中间可以包含"_"符号,表示对数字进行分组 print(n) # 输出十进制数字 14 n = 0x23 # 十六进制数字,以0x开头 print(n) # 输出十进制数字 35 # b.包含小数点或幂运算的数学字面值会生成符点数; n = 3.14. # 标准浮点数 n = 3.14_15_93 # 分组浮点数 n = 3.14e2 # 指数浮点数 # c.在数字学面值末尾加'j'或'J'生成虚数,构成复数。 a = 1.56+1.2j # 复数 print(a.real) # 输出复数实部 1.56 print(a.imag) # 输出复数虚部 1.2
- 调用内置函数。
int([x]) # x 为数字,则直接返回数字表示的整数对象。如果没有传递参数,则返回0 int(10.9) # 输出 10 int(x,base=10) # x 不是数字,或者设置base参数,则x必须是字符串、bytes(字节串)、bytearray(字节数组,表示进制为base的整数字面值) int('0xa',16) # 输出 10 int('1010',2) # 输出 10 float([x]) # floatnumber是浮点数的字符串形式,字母大小写都可以,如”inf'、“Inf”、"INFINITY"和"iNfiNity都可以表示正无穷大 float('-12345\n') # 输出 -12345 float('-infinity') # 输出 -inf complex([real[,imag]]) # 可以将一个字符串或数字转换为复数,real可以是整数、浮点数或字符串,imag可以是整数或浮点数 complex('1) # 输出 1 + 0j complex('1.2','2.3') # 输出 1.2 + 2.3j hex(x) # 能够将一个整数转换为十六进制字符串 bin(x) # 能够将一个整数转换二进制字符串 oct(x) # 能够将一个整数转换八进制字符串 str(object='') # 可以把任意类型的对象转换为字符串 chr(x) # 能够将一个整数转换 Unicode 字符,参数x可以是十进制或十六进制形式的数字,如 chr(0x30)、chr(90) ord(x) # 能够将一个字符转换为整数值,参数x是一个 Unicode 编码的字符,返回对应的十进制整数 bool([x]) # 将任意类型转换为布尔值