Python基础语法详解:从语句结构到核心操作
本文深入解析Python的基础语法结构,涵盖语句与表达式的区别、Python 2与3的语法差异、缩进规则及核心赋值操作。详细讲解print函数的参数用法、短路计算、三元表达式以及while和for循环机制,并介绍zip、map和enumerate等迭代工具,帮助开发者掌握Python简洁高效的编程范式。
Python程序结构
Python常被称为“一切皆对象”,这是初学者最常听到的总结之一。在Python中,最基础的构建单元是对象。对象通过表达式进行创建和处理,而表达式通常包含在语句中。多条语句组合成代码块,多个代码块最终构成完整的程序。Python的核心由语句和表达式组成,因此本文将简要探讨这两者的关系与用法。
鉴于未来可能涉及两个版本的Python,此处先梳理Python 2与Python 3在语句层面的主要差异:
1. Python 2中不存在nonlocal语句。
2. 在Python 2中,print是一条语句;而在Python 3中,print已变为一个内置函数。
3. Python 2在2.5版本之后,将try/except和try/finally合并到了同一个语法结构中。
4. with/as语句在Python 2中不可用,若需使用,必须通过导入__future__模块中的with_statement来实现。
Python语法
作为第一门全面学习的编程语言,Python给人的印象是简单、简洁且清晰。与之前学习的C语言不同,Python的语法成分非常少。其嵌套语法主要依靠行末的冒号来标识,代码块省略了括号(括号为可选),并通过缩进来书写。此外,Python每行之间完全不需要使用分号,一行的结束即代表语句的终止。缩进的结束意味着代码块的结束。因此,缩进语法是Python的核心特性之一。正是由于这一特点,Python程序员能够整齐地写出基于程序逻辑结构、以垂直方式呈现的代码,从而极大地提高了代码的可读性。
此外,还有几点值得注意:
1. Python对缩进没有强制性的严格规定,但约定俗成的做法是首行缩进4个空格。虽然部分程序员喜欢使用Tab键,但作为初学者,建议坚持使用空格。因为Tab在某些环境中可能被解析为8个空格,更重要的是,混合使用Tab和空格的缩进方式在Python 3中会导致程序无法正常运行。
2. Python偶尔会出现单行包含多个语句的情况,此时需要使用分号进行分隔。这也是Python中唯一使用分号的场景,作为语言界定符。
3. 当一个语句过长需要跨越多行时,可以使用括号、方括号或花括号将其括起来,这样语句会一直运行直到括号闭合的那一行。虽然过去曾使用反斜杠(\)作为跨行工具,但这种方式不仅难以关注和维护,且反斜杠后若没有空格容易出错,因此现在已很少使用。
赋值操作
1. 赋值操作仅表示变量引用对象,而非复制对象;
2. 变量在首次被赋值时创建;
3. 必须先定义变量,然后才能引用;
4. 模块导入、函数和类的定义、for循环变量以及函数参数均属于隐式赋值运算。
赋值语句的常见形式:
1. name='jeff'
这是最常见的赋值方式,将变量名与单个对象进行绑定。
2. 元组和列表分解赋值:name, age='jeff', '111',[name, age]=['jeff', '111']
当赋值符号左侧是元组或列表时,Python会将右侧对象与左侧对象从左往右进行配对。
这种赋值可以扩展为序列类型的赋值语句,任何变量名的序列都可以赋值给任何值的序列,例如a, b, c, d='jeff'。这种序列赋值在Python中被通用化了,即两边可以是任意序列,如[a, b, c]=(1, 2, 3),只要序列长度相等即可。最终,右侧会被扩展为任意可迭代对象。
3. 扩展的序列解包:a, *b='jeff'
这种方式适用于Python 3。其中a只匹配一个字符,剩余字符被*引用。并且*b可以出现在赋值变量的任意位置,例如a, *b, c='a, b, c, d'。带*的名称无论匹配多少项,都会向其赋值一个列表,即使未匹配到也会赋值空列表。一个赋值语句中只能有一个带*的名称,还可以写成*a, = [1, 2, 3, 4]。可以说这种解包方式已经取代了切片方式,成为一种更广泛且便利的形式。
4. 多重目标引用:a=b='111'
两个变量都被赋予了相同的值。上述等式实际上是b='111'和a=b的简写。这里两个变量都指向内存中的同一个对象,即引用。
5. 增强型赋值语句:a+=1
输入较少,执行速度较快。增强赋值语句具有三大优点:
(1)输入减少;
(2)左侧只需计算一次。在x=x+y中,x会出现两次,必须执行两次,因此相比之下,增强型赋值语句执行速度更快;
(3)对于支持原地修改的对象,会自动执行原地修改运算。
注:Python中没有a++或a--这种递增运算符,因为Python中的不可变对象无法进行原地修改。
对于扩展列表有两种方式,一种是合并“+”,另一种是extend方法。两者相比,合并操作对共享对象引用产生的副作用更小,但合并操作必须创建一个新的对象,再把左侧复制到列表中,再把右侧复制到列表中,这样运行速度就会很慢。而在增强赋值语句中,会自动调用更快的extend方法。
注:Python的保留字不可以当作变量名来赋值。
表达式语句
表达式语句通常用于原地修改,例如l.append(a),但并不会把修改后的列表返回。事实上,它们返回的是None对象。如果将此表达式赋值给变量,那么只会丢失该列表。
print语句
标准输出流(stdout)、标准输入流和错误流是脚本启动时创建的三种数据连接。
Python 3中的print:
print是一个内置函数,使用关键字参数来表示模式。因为是内置函数的一种,所以它返回的是None。
print(print(1)) 运行结果: 1 None
print的基本语法是:print([obj,...][,sep=' '][,end='\n'][,file=sys.stdout])
其中方括号中的内容为可选内容。sep、end、file使用时要给出name=value的形式给定参数。
sep是每个对象的文本之间插入的一个字符串,默认是单个空格,传一个空字符串将会抑制分隔符。
a=1;s=2;d=3 print(a,s,d) print(a,s,d,sep=',') 运行结果: 2 3 1,2,3
end是添加在打印文本末尾的字符串,默认值为\n。
a=1;s=2;d=3 print(a) print(s,end=' ') print(d,end=' ') 运行结果: 1 2 3
file指定发送到的文件,默认是sys.stdout。这其实是流的重定向的一种形式。
print只是为我们提供了简单的sys.stdout对象的简单接口,它为我们隐藏了很多细节,只是提供一个简单的打印接口。
import sys
sys.stdout.write('hello world\n')
运行结果:
hello world
可使用sys.stdout=open('file', 'mode')方式重定向流的输出。Python 3中这种重定向是暂时的,普通的print还是会打印到原始输出流。
Python 2中的print语句:
print x, y等价于3中的print(x, y);
print x, y, 等价于3中的print(x, y, end=' ');
print >>afile, x, y等价于3中的print(x, y, file=afile);
if测试及语法规则
短路计算
首先,and和or返回的一定是一个对象。在or测试中,Python在找到第一个真值的地方停止。
print(2 or 3) print(0 or 3 or 2) 运行结果: 3
if/else三元表达式
A = Y if X else Z,当X为真的时候,结果为Y;X为假的时候,结果为Z。这也是短路计算。当然也可以写成A=((X and Y) or Z),换句话说就是“if x then y else z”。
while和for循环
while循环
while是Python中最通用的迭代结构,并且while也是有可选else部分的(离开while循环并且没有在此之前break的时候才会执行)。
break、continue、pass、else
break:跳出整个循环语句。
continue:跳出本次循环到下一次循环的开头处。
pass:无运算的占位语句,常用在函数定义阶段,他和None的意义很相似,不过他有着自带的意义:“以后想好再填补”的意思。
else:只有当循环正常结束的时候才会执行。
for循环
for循环的本质其实是一个序列迭代器,用于遍历任何序列对象内的元素或者说可迭代对象的所有元素。逐个将序列对象中的元素赋值给作用域中的变量,break,continue也适用于for循环。
for循环遍历可迭代对象时在每次循环的时候只读一个,并不会将整个对象读到内存,这样运行更快更省内存,例如在文件读取的时候,用for循环遍历远胜于readlines。可以说for循环比while循环更快速。
并行遍历,zip与map:
zip函数可将n个参数的序列转换成n个参数的元组:
print(list(zip(['1','2','3'],(4,5,6),['7','8','9'])))
运行结果:
[('1', 4, '7'), ('2', 5, '8'), ('3', 6, '9')]
print(dict(zip(('1','2','3'),(4,5,6))))
运行结果:
{'3': 6, '2': 5, '1': 4}
zip函数当序列长度不同时,会以最短序列截断得到元组。
Python 2中的map函数和zip极为相似,只是在当长度不同时,不使用最短截断,而是用None补齐。因为太相似了,所以在3中被砍掉了。但是现在map依然可以使用,他还有其他用法:
print(list(map(ord,['1','2','3']))) 运行结果: [49, 50, 51]
enumerate函数:计数器作用的函数。
for (a,b) in enumerate('jeff'):
print(a,b)
运行结果:
j
e
f
f
enumerate函数返回的是生成器对象,每次循环都是next()一次,返回(index, value)元组。
本节总结是在Python学习手册第二部分的小总结,对于迭代的概念,在后面的学习过程中会仔细弄清楚,在写的过程中有什么不对的地方希望大神们给予指正。
以上这篇简单谈谈Python中的语句和语法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









