本篇文章是学习 廖雪峰 Python 教程 过程中自己记录的一些笔记,很多内容都只是针对我自己现有知识的补充,所以可能不具备普遍的参考意义。
如果对原教程有兴趣,可以直接上 廖雪峰老师的网站 进行学习。
使用 print
函数进行输出:
print('hello, world') print('The quick brown fox', 'jumps over', 'the lazy dog') print('100 + 200 =', 100 + 200)
使用 input
函数进行输入:
name = input('Please enter your name: ') print('hello,', name)
Python 中有如下几种数据类型:
''
也可以使用双引号 ""
r''
形式可以防止字符串内部转义 '''...'''
三个单引号可以输入多行文字 Python 是动态类型的语言,声明变量时不需要指定类型,可以随时给变量赋不同类型的值:
a = 123 a = 'ABC'
Python 中没有声明常量的语法,一般使用大写字母来表示常量:
PI = 3.14159265359
Python 中的两种除法:
/
为浮点除法,得出的结果是浮点数 //
为向下整除,得出的结果是整数,并且是向下取整的 编码的发展:
现代计算机系统通用的字符编码工作方式:在计算机内存中,统一使用 Unicode 编码,当需要保存到硬盘或者需要传输的时候,就转换为 UTF-8 编码。
在 Python3 当中,字符串是以 Unicode 编码的,即 Python3 的字符串支持多语言。
使用 ord()
函数可以获取字符的整数表示,使用 chr()
函数可以把编码转换为对应的字符:
>>> ord('A') 65 >>> ord('中') 20013 >>> chr(66) 'B' >>> chr(25991) '文'
Python 的字符串类型是 str
, 在内存中以 Unicode 表示,一个字符对应若干个字节。
如果要在网络上传输,或者保存到磁盘上,需要把 str
变为以字节为单位的 bytes
,可以使用 encode()
方法将 str
编码为指定字符集的 bytes
:
>>> 'ABC'.encode('ascii') b'ABC' >>> '中文'.encode('utf-8') b'/xe4/xb8/xad/xe6/x96/x87'
反之,如果从网络或磁盘上读取了字节流,需要使用 decode()
方法转换为 str
类型:
>>> b'ABC'.decode('ascii') 'ABC' >>> b'/xe4/xb8/xad/xe6/x96/x87'.decode('utf-8') '中文'
可以使用 len()
函数计算 str
字符数,如果要计算 bytes
字符数,需要先将 str
编码为 bytes
类型:
>>> len('中文') 2 >>> len('中文'.encode('utf-8')) 6
当 Python 源代码中包含中文时,为了让解释器按 UTF-8 编码进行读取,我们需要在源文件开头写上这两行:
#!/usr/bin/env python3 # -*- coding: utf-8 -*-
Python 中使用 % 对字符串进行格式化,占位符与 C 语言是一致的:
>>> 'Hello, %s' % 'world' 'Hello, world' >>> 'Hi, %s, you have $%d.' % ('Michael', 1000000) 'Hi, Michael, you have $1000000.'
list 是一种有序的集合,可以随时添加和删除其中的元素。
可以使用索引来获取指定位置的元素,也可以使用负数索引从最后一个元素进行获取。当索引越界时,会引发一个 IndexError 异常。
list 常用的方法:
tuple 也是一种有序列表,与 list 不同的是,tuple 是不可变的。
tuple 的元素必须在定义时就确定下来,定义一个元素的 tuple 方法如下:
>>> t = (1,) >>> t (1,)
Python 的条件判断与其它语言的基本一致,只有两点需要注意:
input
函数的返回值是 str
类型,如果需要获取整数类型,需要使用 int()
函数进行类型转换。
Python 中有两种循环形式:
在 Python 当中没有普通形式的循环,可以使用 for-in
和 range()
方法来进行模拟:
for i in range(10): // ...
同样地,在 Python 当中也没有 do-while
循环。
dict 即字典,使用方法与 Swift 中的字典大同小异。
字典的初始化:
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
当使用 key 对字典进行索引时,如果 key 不存在则 dict 会抛出错误。
可以使用 in
关键字判断 key 是否存在:
'Thomas' in d False
也可以使用 dict 提供的 set
方法,如果 key 不存在,则返回 None,或者自己指定的 value:
>>> d.get('Thomas') >>> d.get('Thomas', -1) -1
要删除 key 可以使用 pop(key)
方法,对应的 value 也会从 dict 中删除。
要正确使用 dict 必须保证它的 key 是 不可变对象 ,Python 中的字符串、整数等都是不可变对象,可以放心使用。
set 也是一组 key 的集合,但是它不存储 value。set 的特点就是存储的 key 不会重复,同时是无序的。
要创建 set 需要使用 list 作为输入集合:
>>> s = set([1, 2, 3]) >>> s {1, 2, 3}
可以使用 add(key)
和 remove(key)
向 set 添加和删除元素。
set 也可以进行取合集和并集操作:
>>> s1 = set([1, 2, 3]) >>> s2 = set([2, 3, 4]) >>> s1 & s2 {2, 3} >>> s1 | s2 {1, 2, 3, 4}
Python 内置函数官方文档: https://docs.python.org/3/library/functions.html
也可以使用 help(<function>)
进行查询。
Python 使用 def
关键字定义函数,定义时不需要指定返回值类型,并且如果在函数体内没有使用 return 语句进行返回,则函数到达函数尾时默认返回 None。
Python 可以使用 tuple 模拟返回多个值:
import math defmove(x, y, step, angle=0): nx = x + step * math.cos(angle) ny = y - step * math.sin(angle) return nx, ny
Python 的函数定义很简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数。
使用默认参数比较简单,需要注意两点:
默认参数的调用方法:可以按顺序提供默认参数,也可以不按顺序但是提供参数名:
defenroll(name, gender, age=6, city='Beijing'): print('name:', name) print('gender:', gender) print('age:', age) print('city:', city) enroll('Bob', 'M', 7) enroll('Adam', 'M', city='Tianjin')
定义默认参数还有最重要的一点:默认参数必须指向不变对象!
defcalc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
这种形式在函数内部接收到的参数是一个 tuple,调用该函数时可以传入任意个参数,包括 0 个参数:
>>> calc(1, 2) 5 >>> calc() 0
如果已经有一个 list 或 tuple,可以使用如下方法调用可变参数方法:
>>> nums = [1, 2, 3] >>> calc(*nums) 14
关键字参数允许传入 0 个或任意个含参数名的参数,这个关键字在函数内部自动组装为一个 dict,定义形式:
defperson(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw)
这时可以只传入必传参数,也可以传入任意个数的关键字参数:
>>> person('Michael', 30) name: Michael age: 30 other: {} >>> person('Adam', 45, gender='M', job='Engineer') name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
如果已经有一个 dict 了,可以使用如下方式调用:
>>> extra = {'city': 'Beijing', 'job': 'Engineer'} >>> person('Jack', 24, **extra) name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
如果要限制关键字参数的名字,就可以用命名关键字参数,定义方式如下:
defperson(name, age, *, city, job): print(name, age, city, job)
和关键字参数 *kw不同,命名关键字参数需要一个特殊分隔符 ,*后面的参数被视为命名关键字参数。
调用方式如下:
>>> person('Jack', 24, city='Beijing', job='Engineer') Jack 24 Beijing Engineer
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
defperson(name, age, *args, city, job): print(name, age, args, city, job)
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错。
命名关键字可以有缺省值,从而简化调用。
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。