Python学习笔记 - Python语法基础
前言
本篇博文主要介绍Python中的一些最基础的语法,其中包括标识符、关键字、内置函数、变量、常量、表达式、语句、注释、模块和包等内容。
一、标识符、关键字和内置函数
任何一种语言都离不开标识符和关键字,下面将介绍Python的标识符和关键字。
1.1 标识符
标识符就是变量、常量、函数、属性、类、模块和包等由程序员指定的名字。构成标识符的字符均有一定的命名规范,Python语言中标识符的命名规则如下:
- 标识符由字母、数字、下划线('_') 组成,首字符可以是下划线('_') 或字母,但不能是数字字符。
- 区分大小写,Myname 和 myname 是两个不同的标识符。
- 标识符不能包含空格,但可以使用下划线来分隔其中的单词。例如,变量名greeting_message可行,但变量名 greeting message会引发错误。
- 标识符不能是Python关键字,但可以包含关键字。例如,变量名class错误,但是变量名stud_class可以。
- 不能使用Python内置的函数名作为自己的标识符。例如,print是内置函数名,不能用作标识符。
【标识符命名建议】
(1)变量名应既简短又具有描述性。例如, name比n好, student_name比s_n好, name_length比length_of_persons_name好
(2)慎用小写字母 l 和大写字母O,因为它们可能被人错看成数字1和0。(3)变量名建议使用小驼峰命名法,函数名、类名建议使用大驼峰命名法。例如,studNo;StudInfo。
- 合法的标识符示例:
身高 # 没错,中文也可以作为标识符,但十分不建议使用,这不是好的编程习惯
identifier # 英文单词作为标识符
userName # 小驼峰命名法
UserName # 大驼峰命名法
user_name # Linux内核命名法
_sys_val # 以下划线开头的标识符
- 非法的标识符示例:
2mail # 数字开头,标识符非法
room# # 包含非法字符#,标识符非法
$name # 包含非法字符$,标识符非法
class # 使用Python关键字作为标识符,非法
《注意》# 和 $ 不能构成标识符。C/C++语言是可以使用美元符号($) 作为标识符的,这一点跟Python语言是有区别的。需要注意一下。
1.2 Python的关键字
关键字是类似于标识符的字符序列,由语言本身定义好。Python语言中有 35 个关键字,只有三个,即 False、None 和 True 是首字母大写。
具体内容见下表1-1所示:
False | None | True | and | as |
assert | async | await | break | class |
def | 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 Shell交互式命令行中查看Python所包含的所有关键字信息:
# 首先,查看当前已安装版本的Python版本号
>>> import sys
>>> print(sys.version)
3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)]
>>> sys.version
'3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)]'
# 然后,查看当前Python版本包含的所有关键字信息
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', '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关键字的个数
>>> len(keyword.kwlist)
35
>>>
《说明》可以看到,Python-3.10.4 版本的所有关键字一共有35个,而之前的 Python 3 版本的关键字只有33个,其中,'async', 'await' 这两个关键字是在 Python-3.5 版本中新添加的,用于异步编程。
1.3 Python内置函数
上面这些内置函数的名字也不应该作为标识符,否则 Python 的内置函数会被覆盖。
示例:内置函数使用实例。
>>> abs(-1024) # 求绝对值函数
1024
>>> bin(255) # 求255的二进制表示
'0b11111111'
>>> round(3.1415726, 3) # 四舍五入,保留小数点后3位有效数字
3.142
《注意》在Python 2.x 中,print 是关键字而不是函数。上面这些内置函数(如 unicode())只是 Python 2.x 的内置函数,为了保证 Python程序具有更好的兼容性,程序也不应该使用这些内置函数的名字作为标识符。
二、变量和常量
2.1 变量
- Python是弱类型语言
Python是弱类型语言,弱类型包含两方面的含义:
(1)所有的变量无须事先声明即可使用,或者说对从未用过的变量赋值就是声明了该变量,并且不需要指定数据类型。
(2)变量的数据类型可以动态改变,同一个变量可以一会儿是数值类型,一会儿是字符串类型。
因此,Python语言也可以看做是一种动态类型语言。
动态类型语言会在运行期间检查变量或表达式的数据类型,主要有 Python、PHP 和 Object-C 等语言。与动态类型语言相对应的是静态类型语言,静态类型语言会在编译期间检查变量或表达式的数据类型,如 Java 和 C/C++ 语言等。
在 Python 中声明变量时不需要指定它的数据类型,只要是给一个标识符赋值就声明了一个变量,示例代码如下:
hello = "HelloWorld" # 第1行
score_for_student = 0.0 # 第2行
y = 20 # 第3行
y = True # 第4行
代码第1行、第2行和第3行分别声明了三个变量,这些变量声明时不需要指定数据类型,你赋给它什么数值,它就是该类型变量了。注意代码第4行是给变量 y 赋一个布尔值 True,虽然 y 已经保存了整数类型值 20,但它也可以接收其他数据类型的值。
《提示》Python是动态类型语言,它不会检查数据类型,在变量声明时不需要指定数据类型。这一点与 Swift 和 Kotlin 语言不同,Swift 和 Kotlin 虽然在声明变量时也可以不指定数据类型,但是它们的编译器会自动推导出该变量的数据类型,一旦该变量确定了数据类型,就不能再接收其他类型数据了。而Python的变量可以继续接收其他类型数据。
2.2 常量
在很多编程语言中常量的定义是一旦初始化后就不能再被修改的。而Python不能从语法层面上定义常量,Python没有提供一个关键字(const)使得变量不能被修改。所以在Python中只能将变量当成常量使用,只是不要修改它。那么这就带来了一个问题,变量可能会在无意中被修改,从而引发程序错误。解决此问题要么靠程序员自律和自查,要么通过一些技术手段使变量不能修改。
《提示》Python作为解释性动态语言,很多情况下代码安全需要靠程序员自查。而Java和C/C++等静态类型语言的这些问题会在编译期被检查出来。
三、Python的注释
Python源代码的注释有两种形式:
- 单行注释
- 多行注释(又称为文档注释)
编写注释的目的是阐述代码要做什么,以及如何做的。要成为一名专业以及出色的程序员,最值得养成的习惯之一是,在代码中编写清晰、简洁的注释。
3.1 单行注释
Python程序单行注释使用井号 “#”,使用时 # 位于注释行的开头,# 后面有一个空格,接着就是注释内容。跟在 # 号后面直到这行结束为止的内容都将被解释器忽略掉。
使用单行注释示例代码如下:
# coding=utf-8 # 1
# 代码文件: hello.py # 2# _hello = "HelloWorld" # 3
# score_for_student = 100 # 4
y = 20
y = "大家好"
print(y) # 打印变量y # 5
代码第1处和第2处中的 # 号是进行单行注释,# 号也可以连续注释多行,见代码第3处和第4处,还可以在一条语句的尾端进行注释,见代码第5处。
注意代码第1处的 # coding=utf-8 的注释作用特殊,是设置Python代码源文件的编码集,该注释语句必须放在源文件的第一行或第二行才能有效,它还有替代写法:
#!/usr/bin/python
# -*- coding: utf-8 -*-
其中 #!/usr/bin/python 注释是在 Unix、Linux 和 macOS 等系统平台上安装多个Python版本时,具体指定哪个版本的Python解释器。一般而言,在Linux操作系统上的Python解释器默认是Python 2.7.5版本的,如果要使用Python 3.x 版本的解释器,应该写成:#!/usr/bin/python3。
《提示》在PyCharm 和 Sublime Text 开发工具中单行注释可以使用快捷键,在Windows系统下的具体步骤是:选中一行或多行代码然后按住 “Ctrl + /” 组合键进行注释。去掉注释也是选中代码后按住 “Ctrl + /” 组合键。
《注意》在程序代码中,对容易引起误解的代码进行注释是很有必要的,但应避免对已清楚表达信息的代码进行注释。需要注意的是,频繁地注释有时反映了代码的低质量。当觉得被迫要加注释时,不妨考虑一下重写代码使其更清晰。
3.2 多行注释
多行注释是指一次性将程序中的多行代码注释掉,在Python程序中使用三个单引号或三个双引号将注释的内容括起来。
示例程序如下:
# 这是一行简单的注释
print("Hello World.")'''
这里面的内容全部是多行注释
Python语言真的很简单
'''# print("这行代码被注释掉了,将不会被编译、执行")"""
这是用三个双引号括起来的多行注释
Python同样是允许的
"""
此外,添加注释也是调试程序的一个重要方法。如果觉得某段代码可能有问题,可以先把这段代码注释掉,让Python解释器忽略这段代码,再次编译、运行,如果程序可以正常执行,则可以说明错误就是由这段被注释代码引起的,这样就缩小了错误所在的范围,有利于定位问题和排错;如果依然出现相同的错误,则可以说明错误不是由这段被注释代码引起的,同样也缩小了错误所在的范围。
四、Python语句
Python程序代码是由关键字、标识符、表达式和语句等内容构成的,语句是代码的重要组成部分。
语句关注代码的执行过程,如 if、for 和 while 等。在Python语言中,一行代码表示一条语句,语句结束可以加分号,也可以省略分号。
示例代码如下:
# coding=utf-8
# 代码文件:chapter4/4.4/hello.py_hello = "HelloWorld"
score_for_student = 10.0; # 没有错误发生
y = 20name1 = "Tom"; name2 = "Tony" # 1
《提示》从编程规范的角度讲,语句结束时不需要加分号,而且每行至多包含一条语句。代码第1处的写法是不规范的,推荐使用:
name1 = "Tom" name2 = "Tony"
Python 还支持链式赋值语句,如果需要给多个变量赋相同的值,可以表示为:
a = b = c = 10
上面这条语句是把整数10赋值给 a、b、c 三个变量。
另外,在 if、for 和 while 代码块的语句中,代码块不是通过大括号("{ }")来界定的,而是通过缩进,缩进在一个级别的代码在相同的代码块中。
# coding=utf-8
# 代码文件:chapter4/4.4/hello.py_hello = "HelloWorld"
score_for_student = 10.0; # 没有错误发生
y = 20name1 = "Tom"; name2 = "Tony"# 链式赋值语句
a = b = c = 10if y > 10:print(y) # 1print(score_for_student) # 2
else:print(y * 10) # 3
print(_hello) # 4
代码第1处和第2处是同一个缩进级别,它们在相同的代码块中。而代码第3处和第4处不在同一个缩进级别中,它们在不同的代码块中。
《提示》一个缩进级别一般是一个制表符(Tab)或4个空格,考虑到不同的编辑器制表符显示的宽度不同,大部分编程语言规范推荐使用4个空格作为一个缩进级别。
五、模块
Python中一个模块就是一个源文件,模块是保存代码的最小单位,模块中可以声明变量、常量、函数、属性和类等Python程序元素。一个模块提供可以访问另一个模块中的程序元素。
下面通过示例介绍模块的作用。现有两个模块module1 和 hello 。module1 模块代码如下:
# coding=utf-8
# 代码文件: HelloProj/module1.pyy = True
z = 10.10print("进入module1模块")
hello 模块会访问 module1 模块的变量,hello 模块的代码如下:
# coding-=utf-8
# 代码文件: HelloProj/hello.pyimport module1 # 导入module1模块 ---1
from module1 import z # 导入module1模块的变量z ---2y = 20
# z = 20.20print(y) # 访问当前模块变量y ---3
print(module1.y) # 访问module1模块变量y ---4
print(z) # 访问module1模块变量z ---5
上述代码中hello模块要访问module1模块的变量 y 和 z。为了实现这个目的,可以通过两种 import 语句导入模块module1中的代码元素。
- import <模块名>,见第1处代码。这种方式会导入模块所有代码元素,访问时需要加“模块名”,见代码第4处:module1.y,module1是模块名,y 是模块module1中的变量。
- from <模块名> import <代码元素>,见第2处代码。这种方式只是导入特定的代码元素,访问时不需要加“模块名”,见第5处代码的变量 z。但是需要注意的是,当变量 z 在当前模块中也有时,module1中的变量 z 会被屏蔽掉,即只有当前模块的变量 z 会生效。
运行 hello.py 代码输出结果如下:
F:\python_work\Python基础\HelloProj>python hello.py
进入module1模块
20
True
10.1# 如果把hello.py模块中的 "# z = 20.20" 注释去掉,则运行结果如下:
F:\python_work\Python基础\HelloProj>python hello.py
进入module1模块
20
True
20.2
从运行结果可见,import 语句会运行导入的模块,注意示例中使用了两次 import 语句,但只执行了一次module1模块的内容。
模块事实上提供了一种命名空间(namespace)。同一个模块内部不能有相同名字的代码元素,但是不同模块之间可以,上述示例中的变量 y 就在两个模块中都有。
- 命名空间:也称为名字空间、名称空间等,它表示者一个标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处在其他命名空间中。
六、Python中的包(package)
如果有两个相同名字的模块,应如何防止命名冲突呢?答案就是使用包(package),很多编程语言都提供了包,例如 Java、Kotlin 等,它们的作用都是一样的,即提供一种命名空间。
6.1 创建包
现在我们重构一下第5节中的示例,现有每个hello模块,它们放在不同的包 com.pkg1 和 com.pkg2 中,如下图1所示,从图中可见包是按照文件夹的层次结构管理的,而且每个包下面都会有一个 __init__.py 文件,它告诉Python解释器这是一个包,这个文件内容一般情况下是空的,但可以编写代码。
既然包是一个文件夹 + 一个空的 __init__.py 文件,那么开发人员就可以自己创建包了。笔者推荐使用 PyCharm 软件工具创建,它在创建文件夹的同时还会创建一个空的 __init__.py 文件,十分方便。
具体步骤:使用 PyCharm 打开创建的项目,右击项目选择 “New —> Python Package”菜单,如下图2所示,在弹出的对话框中输入包名:com.pkg,其中 com 是一个包,pkg 是它的下一层级的包,中间用点号(.)分隔。
![](/assets/blank.gif)
![](/assets/blank.gif)
6.2 导入包
包创建好后,将两个 hello 模块放到不同的包 com.pkg1 和 com.pkg2 中。由于 com.pkg1 的hello模块需要访问 com.pkg2 的 hello 模块中的代码元素,那么如何导入呢?事实上还是通过 import 语句,需要在模块前面加上包名。
重构第5节中的示例,com.pkg2 的 hello 模块的代码内容如下:
# coding=utf-8
# 代码文件: HelloProj2/com/pkg1/hello.pyy = True
z = 10.10print("进入com.pkg2.hello模块")
com.pkg1 的 hello 模块的代码内容如下:
# coding=utf-8
# 代码文件: HelloProj2/com/pkg1/hello.pyimport com.pkg2.hello as module1 # ---1
from com.pkg2.hello import z # ---2y = 20print(y) # 访问当前模块变量y
print(module1.y) # 访问com.pkg2.hello模块的变量y ---3
print(z) # 访问com.pkg2.hello模块的变量z
代码第1处使用 import 语句导入 com.pkg2.hello 模块所有代码元素,由于 com.pkg2.hello 模块名 hello 与当前模块名冲突,因此需要使用 as module1 语句为 com.pkg2.hello 模块提供一个别名 module1,访问时需要加上 module1. 前缀。
代码第2处是导入 com.pkg2.hello 模块中的变量 z。from com.pkg2.hello import z 语句也可以带有别名,该语句可以修改为如下代码:
from com.pkg2.hello import z as x # 为变量z起一个别名x
print(x) # 访问 com.pkg2.hello 模块中的变量z
使用别名的目的是防止发生命名冲突,也就是说要导入的变量 z 的名字在当前模块中已经存在了,为了以示区分,所以给 z 起了一个别名 x。
在PyCharm中选中 com.pkg1.hello 模块文件,鼠标右击,在弹出的菜单栏中,鼠标左击运行按钮,运行结果如下:
"D:\Program Files\Python\python.exe" F:/python_work/Python基础/HelloProj2/com/pkg1/hello.py
进入com.pkg2.hello模块
20
True
10.1进程已结束,退出代码0
遇到的问题:在Dos终端中使用 python 命令运行 com\pkg1\hello.py 文件,发现会报错,报错信息如下:
F:\python_work\Python基础\HelloProj2>python .\com\pkg1\hello.py
Traceback (most recent call last):File "F:\python_work\Python基础\HelloProj2\com\pkg1\hello.py", line 4, in <module>import com.pkg2.hello as module1 # ---1
ModuleNotFoundError: No module named 'com'
解决办法:在执行报错的模块 com\pkg1\hello.py 文件中添加如下内容:
import sys
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(os.path.split(rootPath)[0])
保存成功后,然后在Dos命令行中就可以成功执行了,运行结果如下:
F:\python_work\Python基础\HelloProj2>python .\com\pkg1\hello.py
进入com.pkg2.hello模块
20
True
10.1
【参考链接】
ModuleNotFoundError: No module named ‘XXX‘ 解决方法
参考
《Python从小白到大牛(第1版-2018)》
《疯狂Python讲义(2018.12)》
《Python编程:从入门到实践(2016.7)》
Python学习笔记 - Python语法基础相关推荐
- Python学习笔记 1.0 基础内容篇章
Python学习笔记 1.0 基础内容篇章 注释 变量 一.定义变量 二.使用变量 bug和debug bug: Debug工具: 数据类型 认识数据类型 在定义数据类型时发生的错误: 数据类型的补表 ...
- Python 学习笔记 D1(基础)
Python 学习笔记 D1(基础) 1.注释 #一个注释 ''' 多行注释 ''' 2.运算符与C++相同:+,-,*,/,%,>,<,=,>=,<=,==,!= 与C++不 ...
- Python学习笔记之入门基础
课程链接:Python入门教程--基础阶段_哔哩哔哩_bilibili Python学习笔记 注释 单行注释: * 多行注释: 1.多行前面加# 2."""注释信息&qu ...
- Python学习笔记——Python和基础知识
Python优缺点 优点 简单----Python是一种代表简单主义思想的语言.阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的 ...
- Python学习笔记--Python字符串连接方法总结
声明: 这些总结的学习笔记,一部分是自己在工作学习中总结,一部分是收集网络中的知识点总结而成的,但不到原文链接.如果有侵权,请知会,多谢. python中有很多字符串连接方式,总结一下: 1)最原始的 ...
- Python学习笔记 - Python语言概述和开发环境
一.Python简介 1.1 Python语言简史 Python由荷兰人吉多·范罗苏姆(Guido van Rossum)于1989年圣诞节期间,在阿姆斯特丹,为了打发圣诞节的无聊时间,决心开发一门 ...
- (转载)[python学习笔记]Python语言程序设计(北理工 嵩天)
作者:九命猫幺 博客出处:http://www.cnblogs.com/yongestcat/ 欢迎转载,转载请标明出处. 如果你觉得本文还不错,对你的学习带来了些许帮助,请帮忙点击右下角的推荐 阅读 ...
- Python学习笔记 Python概述 编码规范 输出与输入 变量 标识符
Python学习第一天 Python的概述 1.Python的优缺点 1.1 优点: 1.2 缺点: 2.Python的编码规范 3.注释 3.Python的输出与输入 4.Python中的变量 5. ...
- 学python安装-Python学习笔记-Python安装
Python安装 文章简介:本文介绍在不同操作系统中搭建Python编程环境. 一 搭建编程环境 在不同的操作系统中,Python存在细微的区别,下面介绍两个主要的Python版本. 1.1 Pyth ...
最新文章
- C面向对象之透明指针的运用
- CSS3绘制圆角矩形的简单示例
- 单臂路由实验-VTP
- MATLAB Simulink如何实现S-Function builder功能
- 浅谈iOS 开发中的界面通信
- php网站自动变暗,如何使用JS弹出DIV并使整个页面背景变暗
- 阿里云轻量服务器 外网卡_阿里云服务器购买流程及注意事项
- AVCaptureDevice 属性介绍
- 管理感悟:你的能力是有限的
- 有关于类的定义赋值与调用总结
- 安卓稳定性测试必备工具Monkey详解
- 苹果系统 怎么找到共享计算机,Mac电脑怎么访问共享文件夹
- Win10电脑关机后立即自动重启怎么办
- 360无法打开html,360浏览器打开网页显示不正常怎么办
- word 插入表格,位置不在最左边
- 测试用例的评审和变更
- 怎么复制网页上不能复制的文字(付费文档免费复制),一招搞定
- TO DO ... ...
- 宝塔BT面板专业版(付费)和免费版有什么区别?
- 曾仕强经典语录-《易经的奥秘》