Python基础语法

前言

  这阵子报名了学校一个比赛,是数据统计相关的,里面需要学习到Python爬虫相关知识,于是开始了Python的学习之旅。虽然之前接触过但不是深入的仔细学习,学习一段时间后发现许多有意思的特征,在此作下记录加深记忆,同时方便以后回顾。

  注:本文基于Python3.0及以上版本作讨论。

简介

  该语言是由荷兰著名的“龟叔”Guido van Rossum1989年圣诞节期间设计的编程语言。2021年十月,Tiobe排行榜中Python的受欢饮程度上升至第一名,在JavaC之上,可见Python在近年来的热度。

  相对于JavaCPython是更加「高级」的语言,实现同一个功能,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

print

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 }

  有几点需要注意,dictkey的存储顺序与key的放入顺序无关;key必须是「不可变对象」;若同一个key被赋值多次,则会记住最后一次被赋值的值。

  不可变对象:stringstuplesnumbers

  可修改对象:listdict

  set与dict类似,但不存储value,可以看作一个无序不重复的集合。

函数

  Python中,所有元素皆是对象,函数也不例外。与Java不同,Java中的方法指的是对象的具体行为,而Python中的函数是可调用对象,可使用内置的callable()函数来判断对象能否被调用。也就是说,在Python中完全可以把半数名称赋给一个变量,通过这个变量来调用函数,相当于给一个函数起了一个别名。

  • 定义

  Pyhotn中定义函数需要使用「def」关键字开头,后接函数名,小括号括起来的参数、冒号,然后再缩进内编写函数体。不需要定义函数返回值。函数体不能为空,若想要定义一个什么都不做的函数,需要使用「pass」关键字作为函数体的占位符。

Python的函数允许返回多个值,「return」关键字后的返回值使用逗号「,」隔开即可。本质上返回的多个值是一个「tuple」。

  • 参数

  函数定义时,参数的顺序必须是:

  必选参数、默认参数、可变参数、命名关键字参数、关键字参数

  必选参数:调用函数时,必须传入数量与类型合法的参数

  默认参数:若调用函数时没有传入参数,则函数运行时该参数认为声明时定义的默认值。

  可变参数:传入的参数数量可变,函数内部处理时,可变参数被看作一个「tuple」。

  关键字参数:类似于可变参数,但函数内部处理时被看作一个「dict」,所以传入参数是是按照key-value的键值对形式传入。

  命名关键字参数:类似于关键字参数,但是只接受指定关键字的参数。若函数声明时已有一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符「*」了。

guest
0 评论
内联反馈
查看所有评论