Python基础语法
前言
这阵子报名了学校一个比赛,是数据统计相关的,里面需要学习到Python爬虫相关知识,于是开始了Python的学习之旅。虽然之前接触过但不是深入的仔细学习,学习一段时间后发现许多有意思的特征,在此作下记录加深记忆,同时方便以后回顾。
注:本文基于Python3.0及以上版本作讨论。
简介
该语言是由荷兰著名的“龟叔”Guido van Rossum在1989年圣诞节期间设计的编程语言。2021年十月,Tiobe排行榜中Python的受欢饮程度上升至第一名,在Java和C之上,可见Python在近年来的热度。
相对于Java和C,Python是更加「高级」的语言,实现同一个功能,C或许要500行代码,Java需要100行代码,而Python可能只要50行。但代码少的代价就是运行速度慢,C程序运行需要0.1秒,Java需要1秒,Python或许就需要5秒。
C程序相比非常慢的另一个原因,Python是解释型语言,代码执行时会一行一行地翻译成CPU能理解的机器码,这个过程非常耗时。而C程序是运行前直接编译成CPU能执行的机器码,所以运行时非常快。所以,C语言适合开发那些追求运行速度、充分发挥硬件性能的程序。而Python是用来编写应用程序的高级编程语言。
基础语法
- 保留字符
所有 Python 的关键字只包含小写字母。下面的列表显示了在Python中的保留字。这些保留字不能用作常数或变数,或任何其他标识符名称。
and | del | for | is | raise |
assert | elif | from | lambda | return |
break | else | global | not | try |
class | except | if | or | while |
continue | exec | import | pass | with |
def | finally | in | yield |
- 标识符
在 Python 里,标识符由字母、数字、下划线组成,严格区分大小写。所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。
以下划线开头的标识符是有特殊意义的。以单下划线开头 _foo 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import * 而导入。
以双下划线开头的 __foo 代表类的私有成员,以双下划线开头和结尾的 __foo__ 代表 Python 里特殊方法专用的标识,如 __init__() 代表类的构造函数
- 缩进
Python 的代码块不使用大括号 {} 来控制类,函数以及其他逻辑判断。这也是为什么Python对缩进格式如此严格的原因。Python 最具特色的就是用缩进来写模块,同一代码块内语句必须包含相同的缩进空白量。
- 行
Python中一般以新行作为上一行的结束符,所以一个Python代码中最后往往会留下一行空行作为上一行的结束符。
一行中若要显示多行语句,则使用分号「;」分开。
一条语句若要分多行现实,则使用斜杠「\」将一行语句划分。
方法之间使用空行分隔,表示一段新的代码开始,类与方法入口之间也使用空行分隔。但空行与缩进不同,不插入空行Python解释器运行时也不会出错,但规范化使用空行可大大提高程序的可读性,方便日后维护重构。功能类似于注释。
- 注释
单行注释使用井号「#」作开头,多行注释使用三个单引号「’’’」或双引号「”””」将注释内容括起来。
数据类型
Python有五个标准的数据类型:
Numbers(数字)、String(字符串)、List(列表)、Tuple(元组)、Dictionary(字典)
- 变量
Python中定义一个变量时不需要明确声明类型,并且在后续赋值是可以随时更改该变量指向的数据类型。这种变量本身类型不固定的语言称为动态语言,对应的是静态语言。静态语言在定义变量时必须指定变量类型,如Java是静态语言。
注:Python中没有char类型,一个字符也是字符串
- 常量
就是指不能改变的变量,通常使用全部大写的变量名表示常量,如PI = 3.14159265359。
但事实上Python并没有声明常量的方法,PI也可以被改变。全大写变量名表示常量只是一个习惯用法。
- 整数
Python中整数的值不受位数限制,内存有多大数字就能有多大。同时可以使用不同的进制来表示一个整数,二进制开头使用「0b」,八进制开头「0o」,十六进制「0x」:
print(“二进制:”, 0b10)
print(“八进制:”, 0o10)
print(“十进制:”, 10)
print(“十六进制:”, 0x10)
此外为了提高大数字的可读性,数字中可以添加下划线「 _ 」来进行分隔,10000000和1000_0000是完全一样的。
- 浮点数
也就是小数,可以直接使用数学写法。重点是面对非常大或非常小的浮点数时,就需要使用科学计数法,如1.23 x 10^9。程序中就是用e替代10即可,如1.23 x 10^9,在Python中写作1.23e9。
- 字符串
使用单引号「’……’」或者双引号「”……”」括起来的文本便是字符串。转意字符反斜杠「\」用于标识需要转意的字符,如「\n」表示换行,「\t」表示制表符等。
若某一段字符串包含大量需要转意的字符,则可以使用「r’……’」来表示单引号内部的字符穿默认不转意。
若某一段字符穿包含大量换行,则可以使用三引号「’’’……’’’」来表示多行内容,亦可配合「r」使用。
- 布尔
使用大写开头的True和False表示,同时也可以进行与或非运算,表示为「and」「or」「not」:
True and False # False
True or False # True
not True # False
数据集
- 列表list
是一个有序可变的集合,可以随时增删其中的元素。并且其中的元素类型可以不同。
Python对于数据集的索引有两种取值顺序,左到右默认从0递增,右到左默认从-1递减。这条规律同样适用于string类型。
使用range()方法配合list()方法可以方便的创造一个有规律的整数列表,list() 函数是对象迭代器,可以把range()返回的可迭代对象转为一个列表,返回的变量类型为列表,语法如下:
list(range(start, stop[, step]))
注:range()方法返回的并不是列表,而是一个可迭代对象,可以直接用在for循环中。
- 元组tuple
tuple类似于list,但它一旦初始化后便不能更改,里面所有变量的指向也不会更改。
需要注意的是,当定义只有一个元素的tuple的时候,需要在该元素后面添加一个逗号「,」,避免歧义:
t = (1,)
循环迭代
Python的循环主要分为两种,一种是「for … in …」循环,in后面跟着的可以是所有的「可迭代对象」,会依次把list或tuple中的元素迭代出来,也可通过控制被迭代对象的元素个数来控制循环次数,常使用range()方法实现。
另一种则是「while」循环,两种循环都可以使用「break」或者「continue」语句进行控制。
dict与set
dict是内置字典类,全程dictionary,使用键值对方式存储,特点是查找速度快,占用空间大。dict中,每个key通过哈希算法直接找到对应value的内存地址取出,所以读取速度极快,且不受dict元素个数影响,也说明了为什么dict中不能出现重复的key。定义语法如下:
d = {key1 : value1, key2 : value2 }
有几点需要注意,dict中key的存储顺序与key的放入顺序无关;key必须是「不可变对象」;若同一个key被赋值多次,则会记住最后一次被赋值的值。
不可变对象:strings、tuples、numbers
可修改对象:list、dict
set与dict类似,但不存储value,可以看作一个无序不重复的集合。
函数
Python中,所有元素皆是对象,函数也不例外。与Java不同,Java中的方法指的是对象的具体行为,而Python中的函数是可调用对象,可使用内置的callable()函数来判断对象能否被调用。也就是说,在Python中完全可以把半数名称赋给一个变量,通过这个变量来调用函数,相当于给一个函数起了一个别名。
- 定义
Pyhotn中定义函数需要使用「def」关键字开头,后接函数名,小括号括起来的参数、冒号,然后再缩进内编写函数体。不需要定义函数返回值。函数体不能为空,若想要定义一个什么都不做的函数,需要使用「pass」关键字作为函数体的占位符。
Python的函数允许返回多个值,「return」关键字后的返回值使用逗号「,」隔开即可。本质上返回的多个值是一个「tuple」。
- 参数
函数定义时,参数的顺序必须是:
必选参数、默认参数、可变参数、命名关键字参数、关键字参数
必选参数:调用函数时,必须传入数量与类型合法的参数
默认参数:若调用函数时没有传入参数,则函数运行时该参数认为声明时定义的默认值。
可变参数:传入的参数数量可变,函数内部处理时,可变参数被看作一个「tuple」。
关键字参数:类似于可变参数,但函数内部处理时被看作一个「dict」,所以传入参数是是按照key-value的键值对形式传入。
命名关键字参数:类似于关键字参数,但是只接受指定关键字的参数。若函数声明时已有一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符「*」了。