- 1)认识Python
- 2)掌握Python的基本数据结构及常用操作
- 3)理解Python的程序控制:条件语句、循环语句
- 4)了解Python的函数定义与调用
$ mkdir your_PattRecogLab_directory
$ cd your_PattRecogLab_directory
$ mkdir lab_01
$ cd lab_01
- Windows系统:下载Python,按步骤安装,在"Advanced Options"时,勾选"Add Python to environment variables"。
- Linux, Mac系统自带Python
- Windows系统:Win+R打开'运行',输入cmd
- Linux系统:远程用Xshell, Putty, MobaXterm都可以
- Mac系统:本地打开Terminal App
- Python IDE: PyCharm, PythonSpider, Jupyter Notebook(推荐)
$ python3
# 第一声啼哭:在命令行输入
>>> print("Hello World!")
name = 'Tomas' # 字符串变量(单引号、双引号都可)
myInt = 666 # 整数型变量
myFloat = 1.618 # 浮点型变量
myBool = True # 逻辑型变量
- 第一个字符必须是字母或者下划线
- 剩下的部分可以是字母、下划线或数字
- 变量名称对大小写敏感,比如myname和myName不是同一个变量
几个有效的变量名
a, _abc, abc_12, a1b2_c3
几个无效的变量名
2dog, my-name
myList1 = [4, 2, 3, 2, 5, 1] # 用一对`中括号`创建一个列表型变量,每个元素都是整数
myList2 = ['meat', 'egg', 'fish', 'milk'] # 每个元素都是字符串
myList3 = [365, 'everyday', 0.618, True] # 每个元素也可以是不同的基本数据类型
myList3[1] # 会输出'everyday', python中的元素计数从0开始(不同于R、MATLAB,但和其他大多数语言相同)
myList3[4] # 会报错,4代表'myList3'中的第5个元素,不存在!
myList3[2] = 'happy' # 将其中的第3个元素0.618修改为字符串'happy'
myList3.append(666.666) # 在myList3的尾巴上增加1个元素,这里使用了list的append方法/函数
myList3[4] # 不会报错,会输出 666.666
del(myList3[1]) # 将第2个元素'everyday'删除
# 此时myList3的内容为[365, 'happy', True, 666.666]
myList3[-1] # 表示索引/选取最后1个元素(特别要注意和正向索引的区别,正向从0、负向从1计数)
myList3[1:3] # 输出['happy', True], 这里使用了切片索引(特别特别注意:冒号前的切片包括、冒号后的切片不包括,这是初学python最坑的地方)
myList3[:3] # 输出[365, 'happy', True],等价于myList3[0:3]
myList3[1:] # 输出['happy', True, 666.666],等价于myList3[1:4](虽然索引4代表不存在的第5个元素,但冒号后切片不包括,所以能取到最后1个元素。很奇葩!)
myList3[1:-1] # 输出['happy', True],等价于myList3[1:3]在字符串中表示单引号
"What's your name?"
在字符串中表示双引号
'You are a "BAD" man'
用\'表示单引号,用\"表示双引号( \ 被称为转义字符,\n表示换行,\ 还可用在代码中换行)
'I\'m a \"good\" student'
字符串拼接
str1 = 'good'
str2 = 'student'
str3 = str1 + ' ' + str2
str4 = 'I\'m a ' + str1 + ' ' + str2
str_and_num = str1 + 666 # 字符串和数字相加会报错
str_and_num = str1 + str(666) # 用str函数把数字转换为字符串,不会报错
str_and_num = 'good %d' % 666 # 用%对字符串进行格式化,另外有%f, %.2f, %s等
"%s's score is %d" % ('Mike', 90) # 同时用多个%对多个变量格式化
# 假如我们有一个字符串列表
str_list = ['apple', 'pear', 'orange']
'-'.join(str_list) # 输出'apple-pear-orange',以短横线将各字符串元素连接
''.join(str_list) # 输出'applepearorange', 连接符可以是空串字符串分割
sentence = 'I am a sentence'
sentence.split() # split()函数会默认按空格分割字符串,每个子串组成一个list
section = 'Come on. Let\'s go. Go go go.'
section.split('.') # 指定'.'为分隔符字符串的索引和切片
word = 'helloworld'
word[0] # 输出'h'
word[-2] # 输出'l'
word[0] = 'w' # 会报错,字符串不允许通过索引修改其中字符。如果想修改,只有先转换成列表(用list函数),修改后再用空串将列表中每个字符连接成字符串(用''.join(yourList))
word[:5] # 输出'hello', 切片规则和list相同
'^_^'.join(word) # 输出''h^_^e^_^l^_^l^_^o^_^w^_^o^_^r^_^l^_^d'',(我只是耍个帅 ^_^)字典是键/值对(key:value)的集合,每个键值对之间用逗号分隔,整个字典包括在花括号中
- 键必须是唯一的
- 键只能是基本数据类型,如整数、浮点数、字符串、逻辑值,list不能作为键
- 值没有要求
- 键值对没有顺序,因此无法用索引访问字典中的内容,需要用键来访问
score = {'萧峰':95, '段誉':97, '虚竹':90, True:'Good brother', 100:'Perfect score'} # 用大括号建立一个字典
score['虚竹'] # 输出键对应的值:90
score[True] # 输出键对应的值:'Good brother'
score['虚竹'] = 99 # 修改“虚竹”的得分(后期有无崖子和天山童姥的百余年功力)
score['慕容复'] = 88 # 增加“慕容复”的得分
del(score[100]) # 删除键为100的键值对(注意这里100不是索引,而是score的一个键)和列表list类似,但是元组中的元素不可更改,元组用小括号创建。元组和list同样有索引、切片、遍历等操作
position = (147, 258) # 创建一个只包含数字的元组
weather = ('sunny', 'cloudy', 'rainy') # 创建一个只包含字符串的元组
weather_id = (1, 'sunny', 2, 'cloudy', 3, 'rainy') # 创建一个包含数字和字符串的元组
weather_id[:2] # 输出(1, 'sunny')int('123') # 输出:123, 字符串转整数
float('6.6') # 输出:6.6, 字符串转小数
str(168) # 输出:'168', 数字转字符串
bool(0) # 输出:False, 数字转逻辑值
int('abc') # 会报错,字符串abc不可能转成数字,不符合常识
bool(-3) # 输出:True
bool(False) # 输出:False, 此时的False是python中的特殊关键字,代表0
bool('False') # 输出:True, 此时'False'只是个不为空的字符串
bool('') # 输出:False, 什么都没有
bool(' ') # 输出:True, 看上去空,实际有一个空格x1 = 2
x2 = 8
x1 < 3 # True
x1 == x2 # False
x1 != x2 # True
# -------- and ---------
x1 < 10 and x2 < 10 # True
x1 < 10 and x2 > 10 # False
x1 > 10 and x2 < 10 # False
x1 > 10 and x2 > 10 # False
# -------- or ---------
x1 < 10 or x2 < 10 # True
x1 < 10 or x2 > 10 # True
x1 > 10 or x2 < 10 # True
x1 > 10 or x2 > 10 # False
# -------- not ---------
not(x1<10) # False
not(x1>10) # True格式
if 判断条件:
执行的内容1
执行的内容2
特别说明:判断条件后面的冒号不能少,if内部的语句需要有统一的缩进,一般用4个空格或按一次tab键,并且整个文件要统一,不能空格和tab混用
if x1 < 10:
print('x1 is less than 10') # 命令行会自动输出3个点,需要按一次tab键,然后再输入print命令,按2次回车,输出结果
# and判断
if x1 < 10 and x2 < 10:
print('x1 and x2 are both less than 10')
# if...else...语句
if x1 < x2:
print('x1 is less than x2')
else:
print('x1 is greater than x2')
# if...elif...else语句
if x1 > x2: # 可以通过设置x1, x2的大小,来得到不同的输出
print('x1 is more than x2')
elif x1 > 10:
print('x1 is less than x2, but x1 is greater than 10')
else:
print('x1 is less than x2, and x1 is less than 10')
# if的嵌套
if x1 < 10:
if x2 > 10:
print('x1 is less than 10, but x2 is greater than 10')
else:
print('x1 and x2 are both less than 10')while循环语句格式(同样注意判断条件后面的冒号不能丢)
while 判断条件:
执行的内容1
执行的内容2
iter_m = 0
x1 = 2
while x1 < 20:
x1 = x1*2
iter_m = iter_m+1
print('Iteration %d: x1 is %d' % (iter_m, x1))for循环语句格式(同样注意循环范围后面的冒号不能丢)
for ... in 循环范围:
执行的内容1
执行的内容2
x1 = 2
for i in range(5,10): # 这里使用了range函数产生5到10之间的整数,但不包括10
x1 = x1*i
print('i in range(5,10) is %d: x1 is %d' % (i, x1))循环的嵌套
for i in range(0,5):
for j in range(0,i+1): # 好好体会这里j循环的范围,是随着外层i的取值变化的
print('*', end='')
print()break: 满足条件则结束本层循环
x1 = 2
iter_m = 0
while 1: # 最粗暴的判断条件,1代表无限循环,即死循环
x1 = x1+1
iter_m = iter_m+1
print('Iteration %d: x1 is %d' % (iter_m, x1))
if x1 > 10:
print('x1 is greater than 10 and the while loop should be break!')
break # 如果没有break语句,循环将无限进行下去continue: 满足条件则结束本次循环
x1 = 2
iter_m = 0
while x1 < 10:
x1 = x1+1
iter_m = iter_m+1
if x1 % 2 == 0: # 如果x1是偶数,则打印提示,并结束本次循环
print('x1 is an even number: %d' % x1)
continue
print('Iteration %d: x1 is an odd number %d' % (iter_m, x1)) # 如果x1是奇数,打印提示与数值比如有一个文件:data.txt,内容如下
Hi man!
I am a file.
Try read my mind and print it onto screen!
一次性读所有内容,并一次性将所有内容写到一个新文件中
f = open('data.txt') # 使用open函数打开文件,并返回文件句柄给变量f
data = f.read() # 使用read函数一次性读取所有内容(当文件很大时,慎用!!)
f_out = open('data_out.txt', 'w') # 'w'表示写文件,什么都不加表示读文件
f_out.write(data) # 将所有内容写到新文件
f_out.close() # 关闭'data_out.txt'(不论多复杂的程序,一旦打开过文件,记得最后一定要关闭文件)
f.close() # 关闭'data.txt'读一行处理一行,并将处理结果逐行写到一个新文件中
f = open('data.txt')
line = f.readline() # 使用readline函数读取一行
f_out = open('data_out.txt', 'w')
iter_m = 1
while line != '': # 当读到文件末尾,什么都没有,则结束循环
line = str(iter_m) + ': ' + line # 在当前内容之前加上行号和一个冒号
f_out.write(line) # 将处理后的行写到文件
iter_m = iter_m+1 # 行号累加
line = f.readline() # 读取新行(一定要读取新行,否则一直停留在第一行,即死循环)
f_out.close()
f.close()最简单的函数
# 定义sayHello函数
def sayHello(): # 注意括号后的冒号
print('Hello world!')
# 调用sayHello函数
sayHello() # 输出:Hello world!带参数的函数
# 定义包含1个参数的sayHello函数
def sayHello(who): # 一个参数
print(who + ' says Hello!')
# 调用sayHello函数
sayHello('Jack') # 输出:Jack says Hello!
# 定义包含2个参数的sayHello函数
def sayHello(who, friend): # 两个参数
print('%s says Hello to %s!' % (who, friend))
# 调用sayHello函数
sayHello('Jack', 'Rose') # 输出:Jack says Hello to Rose!Python的模块,类似于R、Perl中的扩展包package,MATLAB中的工具箱toolbox
import os # 引入操作系统os模块
os.getcwd() # 获得当前工作路径(current working directory, cwd),如果不导入os模块,无法使用该函数
dir(os) # 获得os模块中的所有函数和变量
# 每次使用os.getcwd太麻烦,而且os模块中很多函数用不着,导入后浪费资源
from os import getcwd # 只导入getcwd函数
getcwd() # 获得当前工作路径,函数前不用输入模块名
# 获得工作路径竟然要输入6个字母,人家Linux都只用3个字母pwd
from os import getcwd as pwd # 只导入getcwd函数,并且重新命名为pwd
pwd() # 获得当前工作路径,更快捷!参考Python基础教程(crossin全60课)中p126-p135.
尽可能练习每一条命令。犯错越多,进步越快!