Python基础篇之语法
语言特性
高级编程语言一般有两大家族,一是编译性语言,一是解释性语言。编译性语言诸如C,C++,Java等,需要编译成特殊的可执行文件,在指定的环境中执行,如Java编译后是.class文件,需要在Java虚拟机(JVM)中执行。解释性语言也叫脚本语言,能直接在指定环境(解释器)执行的语言。Python属于解释性语言,只要有Python解释器的环境兼可执行。
注释
Python的注释支持单行注释,多行注释。单行注释一般用井号(#)开头,多行注释用三单引号(''' 注释内容 ''')或三双引号("""注释内容""")。好的注释能增加代码的可读性和可维护性,注释尽量标准和正规。个人习惯一般在文件的头部要有该文件的功能描述型注释,推介再加入作者及日期等,根据自己的情况进行注释。
#! /usr/bin/python3
# -*- coding: utf-8 -*-
'''
这里是注释,可以说明这个脚本的功能描述
功能:这是一个测试文件
作者:Darker
日期:2019年10月22日
'''
print("Hello Python")
print(str(__name__))
"""
Python文件既可以独立运行,也可以当做模块导入到其他文件。
当导入到其他的脚本文件的时候,此时__name__的名字其实是导入模块的名字,不是’__main__’,
main代码里面的就不执行了。
"""
if __name__ == '__main__':
print("Main 执行了")
pass
第一行是“#! /usr/bin/python3”,这是是用来说明脚本语言是python,要用/usr/bin下面的程序(工具)python3这个解释器,来解释运行python脚本的,如果环境变量中指定了Python解析器,该行代码可以不用。
字符集
Python基本支持所有字符集,字符集在代码首行或第二行约定,形式如下:
# -*- coding: utf-8 -*-
代码块
Python与其他编程语言最直接的分别在于Python的代码块(或叫代码组)是按缩进区分,相同的代码块有相同的缩进进度。其他的编程语言如C,Java是通过大括号({})进行块区分。如下代码:
# -*- coding: utf-8 -*-
'''
这里是注释,可以说明这个脚本的功能描述
功能:这是一个测试文件
作者:Darker
日期:2019年10月22日
'''
def add(a,b):
return a+b
def doublestr(s,t):
print(str(s) * t)
"""
Python文件既可以独立运行,也可以当做模块导入到其他文件。
当导入到其他的脚本文件的时候,此时__name__的名字其实是导入模块的名字,不是’__main__’,
main代码里面的就不执行了。
"""
if __name__ == '__main__':
print("Main 执行了")
add(1,2)
doublestr('godbirds\n',2)
pass
上面代码块内定义了两个函数,在main方法中调用了,因为Python执行是逐行从上往下执行,所以在main方法内部调用的方法或对象必须是已声明的,否则会报出:NameError: name 'XXX' is not defined的错误。把doublestr方法定义在main的后面则会出现这种情况。
标识符
标识符是由字母、下划线开头的由字母、数字、下划线组成的区分大小写的字符串。与Java一样,字符串命名尽量见文识意。
关键字
关键字是语言内部设定的具有一定意义的关键词汇,不可用于命名为标识符或函数名等。可用代码查看系统内部的关键字信息:
# -*- coding: utf-8 -*-
import keyword
print("关键字为:")
print(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']
数据类型
数据类型包括:Number 数字,String 字符串,List 列表,Set 集合、Tuple 元组,Dictionary 字典。数字、字符串、元祖定义后不可修改。列表、集合、字典可根据下标或者键进行读取和修改。
type(1) # 输出<class 'int'>
type(1.2) # 输出<class 'float'>
type(True) # 输出<class 'bool'>
type(False) # 输出<class 'bool'>
type(1+1j) # 输出<class 'complex'>
type(bool(0)) # 输出<class 'bool'>
print(bool(1)) # 输出True
type([1,2,'str',True]) # 输出<class 'list'>
type({12,3,'str'}) # 输出 <class 'set'>
type((1,2,3,'str',True)) # 输出 <class 'tuple'>
type({'name':'wping','age':18,1:2019}) # 输出<class 'dict'>
- 数字
数字包括:int 整数、float 浮点、bool 布尔、complex 复数
无小数点是整数,带小数点是浮点,0为整数,1.0浮点,a+bj是复数,a实数,b虚数,j虚数单位,复数详见百科,本文不做具体描述和使用。 - 布尔
这里布尔在数字类型里面单独拿出来主要是Python3开始用关键字True 和 False 表示,其底层值依然还是0和1(非零即True)。
# 1、证明 True = 1
print(True == 1) # 输出 True
print(True == 0) # 输出 False
print(True == 2) # 输出 False
# 2、证明 False = 0
print(False == 0) # 输出 True
print(False == -1) # 输出 False
# 3、证明非0即True
bool(1) # 输出 True
bool(2) # 输出 True
bool(100.2) # 输出 True
bool(0) # 输出 False
bool(-1) # 输出 True
- 字符串
字符串用单引号或双引号或str()函数创建,Python中单引号和双引号使用完全相同。备注:字符串是特殊的元组。
a = 'str' # 单引号创建
b = "str" # 双引号创建
c = str('str') # 函数创建
print(type(a)) # 输出 <class 'str'>
print(type(b)) # 输出 <class 'str'>
print(type(c)) # 输出 <class 'str'>
print(a == b) # 输出 True
print(a == b == c) 输出 True
- 列表
列表是使用中括号[] 或list() 函数创建,与Java的列表(List)或数组类似,有序的可重复的数据组合。通过下标访问。
a = [1,'a',"A",'A'] # 中括号创建
b = list((1,'a',"A",'A')) # 函数创建
print(type(a)) # 打印a的类型,输出 <class 'list'>
print(type(b)) # 打印b的类型,输出 <class 'list'>
c = a+b # 两个数组直接相加 或者 list(set(a).union(set(b)))
print(c) # 打印相加后的值,输出 [1, 'a', 'A', 'A', 1, 'a', 'A', 'A']
d = a-b # 不支持两个结合相减
'''
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'list' and 'list'
'''
- 集合
集合用大括号{}或 set()函数创建,与Java的Set 集合类似,无序的不可重复的数据组合。备注:创建空集合必须使用set()函数,不能用空的大括号创建,空的大括号是创建字典的语法。
a = {'a',1,True,None} # 中括号创建集合
b = {'b',2,False,None} # 中括号创建集合
s = set(('b',2,False,None)) # 函数创建集合
print(type(a)) # 打印a的类型,输出<class 'set'>
print(type(b)) # 打印b的类型,输出<class 'set'>
print(type(a)==type(b)) # 输出 True
c = a+b # 不支持集合直接相加
"""
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'set' and 'set'
"""
c = set(a).union(set(b)) # 集合求并集
print(c) # 输出 {False, 1, 'b', 2, 'a', None}
print(type(c)) # 输出<class 'set'>
d = list(set(a).union(set(b))) # 集合求并集转为列表
print(d) # 输出 [False, 1, 'b', 2, 'a', None]
e = set(a).intersection(set(b)) # 集合求交集
print(e) # 输出 {None}
f = set(a).difference(set(b)) # 集合求差集
print(f) # 输出 {1, 'a'}
print(type(f)) # 差集类型输出<class 'set'>
g = list(set(a).difference(set(b))) # 集合求差集转为列表
print(g) # 输出[1, 'a']
print(type(g)) # 输出差集类型<class 'list'>
- 元组
元组用括号或tuple()函数创建,表明一些列不可根据修改的组合,有别于其他的编程语言,但其内部可存储可变的集合或列表或字典等可变的类型。
a = ('a',1,True) # 括号创建元组
b = tuple(('a',1,False)) # 函数创建元组
print(type(a)) # 打印元组类型,输出<class 'tuple'>
print(type(a) == type(b)) # 打印元组类型是否相等,输出True
c = ('a') # 定义单一字符串元组
print(type(c)) #打印元组类型,输出<class 'str'> 故字符串是特殊的元组
print(a[0]) # 根据下标获取元组,输出 a
d = a[1] # 获取元组值赋值给d
print(d) # 打印元组,输出1
a[1] = 2 # 修改元组内部值,错误,故元组内部值不可变
'''
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
'''
- 字典
字典是无序的由键值对组成的数据组合,等同于Java的Map。通过键取值。
a = {'a':1,'x':True} # 中括号创建
b = dict({'b':c,'x':False}) # 函数创建
如下展示了元组不可变和存储可变数据类型案例
备注:>>>后代表Shell命令行,无符号行表是输出结果,后面不再做解释
>>> t = tuple((1,2,'str',[1,2,3],{'a',1,2,3}))
>>> print(t)
(1, 2, 'str', [1, 2, 3], {1, 2, 3, 'a'})
>>> t1 = t[0]
>>> print(t1)
1
>>> t2 = t[3]
>>> print(t2)
[1, 2, 3]
>>> t2[1] = 'change'
>>> print(t2)
[1, 'change', 3]
>>> print(t)
(1, 2, 'str', [1, 'change', 3], {1, 2, 3, 'a'})
>>> t[2] = 'str_chg'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
模块导入
导入某个模块的脚本,与Java import 类似。导入后可在该文件中调用导入的模块内部的类和函数,语法如下:
#导入整个模块A
import A
#导入整个模块A的所有函数
from A import *
#导入模块A的a函数,别名为a
import A.a as a
#导入模块A的 a、b、c函数
from A import a,b,c
输入输出
输入:input("请您录入") 执行函数后等待输入设备输入信息
输出:print("打印的内容") 打印出相应的内容
至此入门基础语法介绍完毕,还有一些不太常用的语法会在后面涉及到的时候提及。后面会再深入基础篇,对数据类型,逻辑运算,流程控制以及异常捕获等进行学习和探讨。