0%

python语法

学习通过 菜鸟教程:https://www.runoob.com/python3/python3-data-type.html

环境

运行python程序

与shell相似

  • 使用python解析器解析python脚本:python test.py
  • 将python解析器放入/usr/bin直接运行脚本:./test.py
  • 启动python解析器,进行交互式编程:python

查看 Python 版本

1
2
python -V
python --version

基础语法

标识符

  • _foo 的代表不能直接访问的类属性
  • 双下划线开头的 __foo代表类的私有成员
  • 双下划线开头和结尾的 __foo__ 代表 Python 里特殊方法专用的标识,如__init__()代表类的构造函数

行和缩进

不使用大括号 {} ,缩进来写模块,缩进的空白数量是可变,但是要一致

一语句多行

\将一行的语句分为多行显示

1
2
3
total = item_one + \
item_two + \
item_three

语句中包含 [], {} 或 () 括号就不需要使用多行连接符

1
2
days = ['Monday', 'Tuesday', 'Wednesday',
'Thursday', 'Friday']

一行多语句

语句之间使用分号;分割

1
import sys; x = 'runoob'; sys.stdout.write(x + '\n')

引号

'"、三引号'''"""来表示字符串,三引号可以由多行组成,编写多行文本的快捷语法,常用于文档字符串,在文件的特定地点,被当做注释。

1
2
3
4
word = 'word'
sentence = "这是一个句子。"
paragraph = """这是一个段落。
包含了多个语句"""

注释

  • 单行注释采用 # 开头

    1
    2
    # 第一个注释
    print ("Hello, Python!") # 第二个注释
  • 多行注释使用三个单引号 '''或三个双引号"""

    1
    2
    3
    4
    5
    """
    这是多行注释,使用双引号。
    这是多行注释,使用双引号。
    这是多行注释,使用双引号。
    """

输入输出

  • 输入 input
1
2
a, b = input().split(" ") # 输入字符串(默认返回类型)a 和 b  以(空格)分隔
a, b, c = int(input()) #输入三个值(int)中间由逗号分隔
  • 输出 print
1
2
3
4
5
6
# 换行输出
print(x)
# "end=" 不换行输出
print(x, end=' ')
# 拼接,中间用空格隔开
print(x,y)

多个语句构成代码组

像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。

1
2
3
4
5
6
if expression : 
suite
elif expression :
suite
else :
suite

命令行参数

sys.argv

1
2
3
import sys
print('参数个数为:', len(sys.argv), '个参数。')
print('参数列表:', str(sys.argv))

getopt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# test.py -i <inputfile> -o <outputfile>
# test.py -h
def main(argv):
inputfile = ''
outputfile = ''
try:
opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
except getopt.GetoptError:
print('test.py -i <inputfile> -o <outputfile>')
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print('test.py -i <inputfile> -o <outputfile>')
sys.exit()
elif opt in ("-i", "--ifile"):
inputfile = arg
elif opt in ("-o", "--ofile"):
outputfile = arg
print('输入的文件为:', inputfile)
print('输出的文件为:', outputfile)

运算符

  • 算术运算符

    • **:幂 - 返回x的y次幂

    • //:取整除 - 返回商的整数部分

    • **=//=**//对应的赋值操作

    • :=:可在表达式内部为变量赋值,if (n := len(a)) > 10:

  • 逻辑运算符

    • andornot:python 没有 && 、||、!,与之对应的用andornot代替
  • 成员运算符

运算符 描述 实例
in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in 如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。
  • 身份运算符

is 与 == 区别:

is 用于判断两个变量引用对象是否为同一个(同一块内存空间), == 用于判断引用变量的值是否相等。

运算符 描述 实例
is is 是判断两个标识符是不是引用自一个对象 x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False
is not is not 是判断两个标识符是不是引用自不同对象 x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。

控制语句

条件语句

1
2
3
4
5
6
7
8
if num == 3:            # 判断num的值
print('boss')
elif num == 2:
print('user')
else:
print('roadman') # 条件均不成立时输出

if (var == 100) : print "变量 var 的值为100" # 简单的语句组

循环语句

支持breakcontinue

while

1
2
3
4
5
6
7
8
9
10
11
while (count < 9):
print('The count is:', count)
count = count + 1
# while...else
count = 0
while count < 3:
print(count)
count = count + 1
else:
print(count)
# 0 1 2 3

for

1
2
3
4
5
6
7
8
9
fruits = ['banana', 'apple',  'mango']
for fruit in fruits:
print('当前水果: %s'% fruit)

# 通过序列索引迭代
for index in range(len(fruits)):
print('当前水果 : %s' % fruits[index])

# for...else 同while...else
range()函数

生成数列,左开右闭,第三个参数为步长

1
2
3
# range(1): 0 
# range(4, 6):4,5
# range(0, 8, 3): 0,3,6

pass 语句

pass 不做任何事情,一般用做占位语句,即必须要有个语句,但又没有需要执行的指令时使用

1
2
while True:
pass # 等待键盘中断 (Ctrl+C)

函数与变量

1
2
3
4
5
# 定义函数
def printme( str ):
# 打印任何传入的字符串
print (str)
return

变量

在 python 中,类型属于对象,对象有不同类型的区分,变量是没有类型的,仅仅是一个对象的引用(一个指针)

在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象

  • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a

  • 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了

函数参数

函数参数传递

  • 不可变类型:类似 C++ 的值传递,如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。
  • 可变类型:类似 C++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响

关键字参数

默认参数

1
def printinfo( name, age = 35 ):

不定长参数

加了星号 * 的参数会以元组(tuple)的形式导入

加了两个星号 \ 的参数会以字典的形式导入

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python3

def printinfo(*vartuple):
for var in vartuple:
print (var, end=' ')
return
printinfo( 70, 60, 50) # 70 60 50

def printinfo2(**vardict):
print (vardict)
printinfo2(a=2,b=3) # {'a': 2, 'b': 3}

错误与异常

异常捕获:try/except…else

1
2
3
4
5
6
7
8
9
10
11
12
try:
    runoob()
except AssertionError as error:
    print(error)
else: # 可以不用
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as fnf_error:
        print(fnf_error)
finally: # 可以不用,真正的作用是即时仍有异常未被捕获,也会被执行
    print('这句话,无论异常是否发生都会执行。')

抛出异常 raise

1
2
3
x = 10
if x > 5:
    raise Exception('x 不能大于 5。x 的值为: {}'.format(x))

自定义异常

1
2
3
4
5
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)

预定义的清理行为与“with”关键

一些对象定义了标准的清理行为,可以理解为C++中析构函数

Python 中的 with 语句用于异常处理,封装了 try…except…finally 编码范式,使代码更清晰、更具可读性。下面两段代码等效

1
2
with open("myfile.txt", 'w') as f:
f.write('hello world')
1
2
3
4
5
file = open('myfile.txt', 'w')
try:
    file.write('hello world')
finally:
    file.close()

模块