第1部分:Python 基础教程 1、Hello/编码 Python2.x中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错。 解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*- 或者 #coding=utf-8 就行了。 Python3.X 源码文件默认使用utf-8编码,所以可以正常解析中文,无需指定 UTF-8 编码 [root@hadron python]# vi hello.py
#!/usr/bin/python
#coding=utf-8
#输出语句
print("你好,世界");
#输入语句
name=raw_input("Enter your name:")
print "hello,"+name+"!"
[root@hadron python]# python hello.py 你好,世界 Enter your name:程裕强 hello,程裕强! 脚本说明: "#"后面是注释 "/"做转义字符用 #!/usr/bin/python是说程序用的环境的路径,/usr/bin/python是linux用的路径 有了该声明,脚本添加可执行权限之后可以直接运行,不用每次都python [root@hadron python]# chmod +x hello.py [root@hadron python]# hello.py bash: hello.py: 未找到命令... [root@hadron python]# ./hello.py 你好,世界 2、标示与注释 python中的标识符是区分大小写 以下划线开头的标识符是有特殊意义的。以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用"from xxx import *"而导入;
以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如__init__()代表类的构造函数。
Python的代码块不使用大括号({})来控制类,函数以及其他逻辑判断。python最具特色的就是用缩进来写模块。
缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行。 建议你在每个缩进层次使用 单个制表符 或 两个空格 或 四个空格 , 切记不能混用 Python语句中一般以新行作为为语句的结束符,但是我们可以使用斜杠( \)将一行的语句分为多行显示。函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。空行与代码缩进不同,空行并不是Python语法的一部分。书写时不插入空行,Python解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。 Python可以在同一行中使用多条语句,语句之间使用分号(;)分割 您可以通过使用del语句删除单个或多个对象的引用
python中单行注释采用 # 开头。
Python 接收单引号( ' )、双引号( " )、三引号( ''' 或 """ ) 来表示字符串,引号的开始与结束必须的相同类型的。其中三引号可以由多行组成,编写多行文本的快捷语法,常用语文档字符串,在文件的特定地点,被当做注释。 [root@hadron python]# vi print.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
word="""这是一个段落
包含了多行"""
print(word);
'''
这是多行注释,使用单引号。
这是多行注释,使用单引号。
'''
"""
这是多行注释,使用双引号。
这是多行注释,使用双引号。
"""
#打印多个表达式,表达式中间会插入一个空格
print "Age:",20
#在上一句结尾处加上逗号,下一句会在同一行打印,
print "Hello,",
print "World!"
[root@hadron python]# chmod +x print.py [root@hadron python]# ./print.py 这是一个段落 包含了多行 Age: 20 Hello, World! 3、变量 [root@hadron python]# vi var.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
age=20 #整型
sum=3.14 #浮点型
name="hadron" #字符串
print age
print sum
print name
print age**sum #age的sum次幂
print 9//2 #正数商4
print 9//2.0 #4.0
[root@hadron python]# chmod +x var.py [root@hadron python]# ./var.py 20 3.14 hadron 12168.4198643 4 4.0 4、分支语句 [root@hadron python]# vi if.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
a = 21
b = 10
c = 0
#比较运算
if(a>0):
print 'a:正数'
else:
print 'a:非正数'
if(b+c>a):
print "b+c大于a"
else:
print "b+c不大于a"
#逻辑运算
if(a and b):
print "与:如果a为False,返回False,否则它返回b的计算值"
print a and b
if(a or b):
print("或:如果a非0,返回a值,否则它返回b的计算值")
print(a or b)
print not c
[root@hadron python]# chmod +x if.py [root@hadron python]# ./if.py a:正数 b+c不大于a 与:如果a为False,返回False,否则它返回b的计算值 10 或:如果a非0,返回a值,否则它返回b的计算值 21 True elif语句: [root@hadron python]# vi elif.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
num = 5
if num == 3: # 判断num的值
print 'boss'
elif num == 2:
print 'user'
elif num == 1:
print 'worker'
elif num < 0: # 值小于零时输出
print 'error'
else:
print 'roadman' # 条件均不成立时输出
[root@hadron python]# chmod +x elif.py [root@hadron python]# ./elif.py roadman 5、in与is [root@hadron python]# vi in_is.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
a = 10
b = 20
list = [1, 2, 3, 4, 5 ];
if (a in list ):
print "变量 a 在给定的列表中 list 中"
else:
print "变量 a 不在给定的列表中 list 中"
if ( b not in list ):
print "变量 b 不在给定的列表中 list 中"
else:
print "变量 b 在给定的列表中 list 中"
a = "20"
b = '20'
#is是判断两个标识符是不是引用自一个对象
if ( a is b ):
print "a 和 b 引用相同对象"
else:
print "a 和 b 引用不同对象"
print id(a)
print id(b)
[root@hadron python]# chmod +x in_is.py [root@hadron python]# ./in_is.py 变量 a 不在给定的列表中 list 中 变量 b 不在给定的列表中 list 中 a 和 b 引用相同对象 140232573171232 140232573171232 6、循环语句 else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行 [root@hadron python]# vi for.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# while循环
i = 1
sum =0
while i < 100:
i += 1
if i%2 > 0: # 非双数时跳过
continue
sum+=i
print sum
#for循环
for num in range(10,20): # 迭代 10 到 20 之间的数字
for i in range(2,num): # 根据因子迭代
if num%i == 0: # 确定第一个因子
j=num/i # 计算第二个因子
print '%d 等于 %d * %d' % (num,i,j)
break # 跳出当前循环
else: # 循环的 else 部分
print num, '是一个质数'
[root@hadron python]# chmod +x for.py [root@hadron python]# ./for.py 2550 10 等于 2 * 5 11 是一个质数 12 等于 2 * 6 13 是一个质数 14 等于 2 * 7 15 等于 3 * 5 16 等于 2 * 8 17 是一个质数 18 等于 2 * 9 19 是一个质数 说明: 语句print num, '是一个质数' 相当于一行输出两个字符串 7、字符串 注意文件名不能命名为string [root@hadron python]# vi str.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
a = "Hello"
b = "Python"
print "a + b 输出结果:", a + b
print "a * 2 输出结果:", a * 2
print "a[1] 输出结果:", a[1]
print "a[1:4] 输出结果:", a[1:4]
if( "H" in a) :
print "H 在变量 a 中"
else :
print "H 不在变量 a 中"
print "My name is %s and weight is %d kg!" % ('Hadron', 21)
print "Python".lower()
print "Python".find("on")
[root@hadron python]# chmod +x str.py [root@hadron python]# ./str.py a + b 输出结果: HelloPython a * 2 输出结果: HelloHello a[1] 输出结果: e a[1:4] 输出结果: ell H 在变量 a 中 My name is Hadron and weight is 21 kg! python 4 8、列表(List) 列表是常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。 列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。 列表的数据项不需要具有相同的类型。 与字符串的索引一样,列表索引从0开始。列表可以进行截取、组合等。 [root@hadron python]# vi mylist.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
list=["C","C++","Java","Python",3.1415,110]
print list[0]
print list[1:3] #[m,n]从第m+1个元素到第n个元素
print list[2:]
list[0]="C语言" #更新
del list[1] #删除
list.append("C#") #追加
print list
print str(list).decode('string_escape')
print len(list) #列表长
[root@hadron python]# chmod +x mylist.py [root@hadron python]# ./mylist.py C ['C++', 'Java'] ['Java', 'Python', 3.1415, 110] ['C\xe8\xaf\xad\xe8\xa8\x80', 'Java', 'Python', 3.1415, 110, 'C#'] ['C语言', 'Java', 'Python', 3.1415, 110, 'C#'] 6 9、字典 列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。 [root@hadron python]# vi dict.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
dict = {}
dict[1]='hello';
dict['one']="only one"
mydict = {'name': 'john','code':6734, 'dept': 'sales'}
print dict[1]
print dict['one']
print mydict
print mydict.keys()
print mydict.values()
[root@hadron python]# chmod +x dict.py [root@hadron python]# ./dict.py hello only one {'dept': 'sales', 'code': 6734, 'name': 'john'} ['dept', 'code', 'name'] ['sales', 6734, 'john'] 10、元组 Python的元组与列表类似,不同之处在于元组的元素不能修改。 元组使用小括号,列表使用方括号。元组与字符串类似,下标索引从0开始,可以进行截取,组合等。 [root@hadron python]# vi mytuple.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
tuple=('hi',1,"e",2.7,'ok',"china")
print tuple
print tuple[0]
print tuple[-2] #反向到数第二个
print tuple[1:3] #从第2到第3个元素
print tuple[2:]
#元组不能更新,可以通过组合生成新元组
print (1,2,3)+(4,5,6)
for x in (1,2,3):print x
[root@hadron python]# chmod +x mytuple.py [root@hadron python]# ./mytuple.py ('hi', 1, 'e', 2.7, 'ok', 'china') hi ok (1, 'e') ('e', 2.7, 'ok', 'china') (1, 2, 3, 4, 5, 6) 1 2 3 11、时间 [root@hadron python]# vi time.py [root@hadron python]# chmod +x time.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time
import calendar
# 格式化成2016-03-20 11:45:39形式
print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
cal = calendar.month(2016, 1)
print "以下输出2016年1月份的日历:"
print cal;
[root@hadron python]# ./time.py Traceback (most recent call last): File "./time.py", line 3, in <module> import time File "/root/python/time.py", line 6, in <module> print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) AttributeError: 'module' object has no attribute 'strftime' import的module是time,而我给这个python文件命名的也是time,估计是冲突了 [root@hadron python]# mv time.py mytime.py [root@hadron python]# rm -rf time.pyc [root@hadron python]# ./mytime.py 2017-01-22 15:28:12 以下输出2016年1月份的日历: January 2016 Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 12、函数 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号起始,并且缩进 return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。 所有参数(自变量)在Python里都是按引用传递。如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。 允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。 [root@hadron python]# vi fun.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#可写函数说明
def f1(name, age ):
"打印任何传入的字符串"
print "Name: ", name;
print "Age ", age;
age=0;
name="";
return;
def f2(name="无名氏",age=18):
"缺省参数的值如果没有传入,则被认为是默认值"
print "Name: ", name;
print "Age ", age;
return;
#加了星号*的变量名会存放所有未命名的变量参数
def f3(arg1,*vartuple):
"打印任何传入的参数"
print arg1
for var in vartuple:
print var
return;
age=20
name="hadron"
#调用f1函数
f1(age, name);
f2();
f3(10);
f3(11,13,17);
[root@hadron python]# ./fun.py Name: 20 Age hadron Name: 无名氏 Age 18 10 11 13 17 13、lambda lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。 lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。 lambda的一般形式是关键字lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式。lambda是一个表达式而不是一个语句。它能够出现在Python语法不允许def出现的地方。作为表达式,lambda返回一个值(即一个新的函数)。 lambda存在意义就是对简单函数的简洁表示 lambda用来编写简单的函数,而def用来处理更强大的任务 [root@hadron python]# vi lambda.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#lambda的一般形式是关键字lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式
sum = lambda arg1, arg2: arg1 + arg2;
print sum(10, 20)
#map函数
L = [1,2,3,4]
def inc(x):
return x+10
print map(inc,L)
print map((lambda x: x+10),L)
#filter函数
li = [11, 22, 33]
new_list = filter(lambda arg: arg > 22, li)
#reduce函数
for i in new_list:
print i
result = reduce(lambda arg1, arg2: arg1 + arg2, li)
print result
[root@hadron python]# ./lambda.py 30 [11, 12, 13, 14] [11, 12, 13, 14] 33 66 14、模块 模块就是一个保存了Python代码的文件。模块能定义函数,类和变量。模块里也能包含可执行的代码。 想使用Python源文件,只需在另一个源文件里执行import语句,当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。 Python的from语句让你从模块中导入一个指定的部分到当前命名空间中。 模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录 [root@hadron python]# vi import.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 导入模块
import math
# 调用模块中的函数:模块.函数
print math.sqrt(2)
#变量引用函数
foo=math.sqrt
print foo(2)
[root@hadron python]# ./import.py 1.41421356237 1.41421356237 from .. import .. 通过“from 模块 import 函数”形式引入,可以直接使用函数,而不需要使用前缀模块名 [root@hadron python]# vi from_import.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from math import sqrt
print sqrt(2)
[root@hadron python]# ./from_import.py 1.41421356237 15、文件I/O 先用Python内置的open()函数打开一个文件,创建一个file对象,调用相关方法进行读写 r:以只读方式打开文件。文件的指针将会放在文件的开头。 w:打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 +:表示读写都是允许的 a:以追加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,原内容会被保留。 b:打开的文件为二进制文件,而非纯文字文件 write(string)方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。 write()方法不会在字符串的结尾添加换行符('\n'): read([count])方法从一个打开的文件中读取一个字符串 该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。 [root@hadron python]# vi file1.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开一个文件
f = open("test.txt", "wb+")
print "文件名: ", f.name
print "是否已关闭 : ", f.closed
print "访问模式 : ", f.mode
print "末尾是否强制加空格 : ", f.softspace
#写入文件
f.write("Hello,world!\n");
f.write("你好,世界!\n")
f.write("程裕强\n");
# 关闭打开的文件
f.close()
[root@hadron python]# ./file1.py 文件名: test.txt 是否已关闭 : False 访问模式 : wrb+ 末尾是否强制加空格 : 0 [root@hadron python]# vi file2.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开一个文件
f = open("test.txt", "r")
#读取4个字符
str = f.read(4);
print "读取的字符串是 : ", str
#读取1行
print "读取1行:",f.readline()
#读取所有行
for line in f.readlines():
print line,
# 关闭打开的文件
f.close()
[root@hadron python]# ./file2.py 读取的字符串是 : Hell 读取1行: o,world! 你好,世界! 程裕强 [root@hadron python]# vi file3.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# with语句打开文件并赋值到变量f,文件在语句结束后会自动关闭
with open("test.txt", "r") as f:
while True:
# 查找当前位置
print "当前文件位置 : ", f.tell()
#输出1行
line=f.readline()
print line,
if not line:break
# 把指针再次重新定位到文件开头
f.seek(0, 0);
print "重新读取:\n", f.read();
[root@hadron python]# chmod +x file3.py [root@hadron python]# ./file3.py 当前文件位置 : 0 Hello,world! 当前文件位置 : 13 你好,世界! 当前文件位置 : 32 程裕强 当前文件位置 : 42 重新读取: Hello,world! 你好,世界! 程裕强 16、目录 os模块有许多方法能帮你创建,删除和更改目录。 [root@hadron python]# vi dir.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
# 创建目录test
os.mkdir("test")
# 将当前目录改为"/root/python/test"
os.chdir("/root/python/test")
# 给出当前的目录
print os.getcwd()
[root@hadron python]# chmod +x dir.py [root@hadron python]# ./dir.py /root/python/test 17、异常处理 try: <语句> #运行别的代码 except <名字>: <语句> #如果在try部份引发了'name'异常 except <名字>,<数据>: <语句> #如果引发了'name'异常,获得附加的数据 else: <语句> #如果没有异常发生 [root@hadron python]# vi try.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
f = open("test", "w")
f.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功"
f.close()
[root@hadron python]# python try.py Error: 没有找到文件或读取文件失败 修改:f = open("test.txt", "w") [root@hadron python]# python try.py 内容写入文件成功 [root@hadron python]# cat test.txt 这是一个测试文件,用于测试异常!![root@hadron python]# 以使用raise语句自己触发异常 [root@hadron python]# vi try2.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def f(level ):
if level < 1:
#触发异常后,后面的代码就不会再执行
raise Exception("Invalid level!", level)
try:
f(0)
except "Invalid level!":
print 1
else:
print 2
[root@hadron python]# python try2.py Traceback (most recent call last): File "try2.py", line 8, in <module> f(0) File "try2.py", line 6, in f raise Exception("Invalid level!", level) Exception: ('Invalid level!', 0)