Python 基础教程
实例(Python 2.0+)
#!/usr/bin/python
print "Hello, World!";
实例(Python 3.0+)
#!/usr/bin/python
print("Hello, World!");
Python 简介
Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Python 环境搭建
集成开发环境: PythonWin
Python 中文编码
#!usr/bin/python
#coding=utf-8
print("hello world!");
Python 基础语法
-
交互式编程
交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码。 -
脚本式编程
通过脚本参数调用解释器开始执行脚本,直到脚本执行完毕。当脚本执行完成后,解释器不再有效。
$ python test.py
以下划线开头的标识符是有特殊意义的。
-
以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用"from xxx import *"而导入;
-
以双下划线开头的(foo)代表类的私有成员;以双下划线开头和结尾的(foo)代表python里特殊方法专用的标识,如init()代表类的构造函数。
-
在Python的代码块中必须使用相同数目的行首缩进空格数。
-
我们可以使用斜杠( \)将一行的语句分为多行显示.
-
python中单行注释采用 # 开头。
-
python 中多行注释使用三个单引号(''')或三个双引号(""")。
-
缩进相同的一组语句构成一个代码块,我们称之代码组。
Python 变量类型
exit()就可以退出
- Python中的变量不需要声明.
Python有五个标准的数据类型:
- Numbers(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Dictionary(字典)
Python字符串
python的字串列表有2种取值顺序:
- 从左到右索引默认0开始的,最大范围是字符串长度少1
- 从右到左索引默认-1开始的,最大范围是字符串开头
s = 'ilovepython'
s[1:5]
结果是love,第一个要,最后一个不要。
- 加号(+)是字符串连接运算符,星号(*)是重复操作。如下实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
str = 'Hello World!'
print str # 输出完整字符串
print str[0] # 输出字符串中的第一个字符
print str[2:5] # 输出字符串中第三个至第五个之间的字符串
print str[2:] # 输出从第三个字符开始的字符串
print str * 2 # 输出字符串两次
print str + "TEST" # 输出连接的字符串
以上实例输出结果:
Hello World!
H
llo
llo World!
Hello World!Hello World!
Hello World!TEST
Python列表
- 列表用[ ]标识。
- 列表中的值得分割也可以用到变量[头下标:尾下标],就可以截取相应的列表,从左到右索引默认0开始的,从右到左索引默认-1开始,下标可以为空表示取到头或尾。
- 加号(+)是列表连接运算符,星号(*)是重复操作。如下实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
tinylist = [123, 'john']
print list # 输出完整列表
print list[0] # 输出列表的第一个元素
print list[1:3] # 输出第二个至第三个的元素
print list[2:] # 输出从第三个开始至列表末尾的所有元素
print tinylist * 2 # 输出列表两次
print list + tinylist # 打印组合的列表
以上实例输出结果:
['abcd', 786, 2.23, 'john', 70.2]
abcd
[786, 2.23]
[2.23, 'john', 70.2]
[123, 'john', 123, 'john']
['abcd', 786, 2.23, 'john', 70.2, 123, 'john']
Python元组
- 元组是另一个数据类型,类似于List(列表)。
- 元组用"()"标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
tinytuple = (123, 'john')
print tuple # 输出完整元组
print tuple[0] # 输出元组的第一个元素
print tuple[1:3] # 输出第二个至第三个的元素
print tuple[2:] # 输出从第三个开始至列表末尾的所有元素
print tinytuple * 2 # 输出元组两次
print tuple + tinytuple # 打印组合的元组
以上实例输出结果:
('abcd', 786, 2.23, 'john', 70.2)
abcd
(786, 2.23)
(2.23, 'john', 70.2)
(123, 'john', 123, 'john')
('abcd', 786, 2.23, 'john', 70.2, 123, 'john')
以下是元组无效的,因为元组是不允许更新的。而列表是允许更新的:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
tuple[2] = 1000 # 元组中是非法应用
list[2] = 1000 # 列表中是合法应用
Python元字典
- 字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。
- 两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
- 字典用"{ }"标识。字典由索引(key)和它对应的值value组成。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
dict = {}
dict['one'] = "This is one"
dict[2] = "This is two"
tinydict = {'name': 'john','code':6734, 'dept': 'sales'}
print dict['one'] # 输出键为'one' 的值
print dict[2] # 输出键为 2 的值
print tinydict # 输出完整的字典
print tinydict.keys() # 输出所有键
print tinydict.values() # 输出所有值
输出结果为:
This is one
This is two
{'dept': 'sales', 'code': 6734, 'name': 'john'}
['dept', 'code', 'name']
['sales', 6734, 'john']
Python 运算符
a**b 为10的20次方, 输出结果 100000000000000000000
if ( a == b ): print "1 - a 等于 b"
else: print "1 - a 不等于 b"
- << 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。
- ">>"右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数
Python成员运算符
- in 如果在指定的序列中找到值返回 True,否则返回 False。
- not in 如果在指定的序列中没有找到值返回 True,否则返回 False。
a = 10
b = 20
list = [1, 2, 3, 4, 5 ];
if ( a in list ):
print "1 - 变量 a 在给定的列表中 list 中"
else:
print "1 - 变量 a 不在给定的列表中 list 中"
Python身份运算符
- 身份运算符用于比较两个对象的存储单元
- is is是判断两个标识符是不是引用自一个对象
- is not is not是判断两个标识符是不是引用自不同对象
a = 20
b = 20
if ( a is b ):
print "1 - a 和 b 有相同的标识"
else:
print "1 - a 和 b 没有相同的标识"
Python 条件语句
if 判断条件:
执行语句……
else:
执行语句……
if 判断条件1:
执行语句1……
elif 判断条件2:
执行语句2……
elif 判断条件3:
执行语句3……
else:
执行语句4……
Python While循环语句
#!/usr/bin/python
# -*- coding: UTF-8 -*-
var = 1
while var == 1 : # 该条件永远为true,循环将无限执行下去
num = raw_input("Enter a number :")
print "You entered: ", num
print "Good bye!"
#!/usr/bin/python
count = 0
while count < 5:
print count, " is less than 5"
count = count + 1
else:
print count, " is not less than 5"
注意:以上的无限循环你可以使用 CTRL+C 来中断循环。
Python for 循环语句
#!/usr/bin/python
# -*- coding: UTF-8 -*-
for letter in 'Python': # 第一个实例
print '当前字母 :', letter
fruits = ['banana', 'apple', 'mango']
for fruit in fruits: # 第二个实例
print '当前字母 :', fruit
print "Good bye!"
当前字母 : P
当前字母 : y
当前字母 : t
当前字母 : h
当前字母 : o
当前字母 : n
当前字母 : banana
当前字母 : apple
当前字母 : mangoGood bye!
通过序列索引迭代
- 另外一种执行循环的遍历方式是通过索引,如下实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
fruits = ['banana', 'apple', 'mango']
for index in range(len(fruits)):
print '当前水果 :', fruits[index]
print "Good bye!"
#!/usr/bin/python
# -*- coding: UTF-8 -*-
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, '是一个质数'
Python pass 语句
- Python pass是空语句,是为了保持程序结构的完整性。
- pass 不做任何事情,一般用做占位语句。
- Python 语言 pass 语句语法格式如下:
pass
Python 数字
数据类型是不允许改变的,这就意味着如果改变数字数据类型得值,将重新分配内存空间。
以下实例在变量赋值时 Number 对象将被创建:
var1 = 1
var2 = 10
您也可以使用del语句删除一些数字对象引用。
del语句的语法是:
del var1[,var2[,var3[....,varN]]]]
Python 字符串
#!/usr/bin/python
var1 = 'Hello World!'
var2 = "Python Runoob"
print "var1[0]: ", var1[0]
print "var2[1:5]: ", var2[1:5]
以上实例执行结果:
var1[0]: H
var2[1:5]: ytho
Python字符串格式化
- Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。
#!/usr/bin/python
print "My name is %s and weight is %d kg!" % ('Zara', 21)
以上实例输出结果:
My name is Zara and weight is 21 kg!
Python三引号(triple quotes)
- python中三引号可以将复杂的字符串进行复制:
- python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。
- 三引号的语法是一对连续的单引号或者双引号(通常都是成对的用)。
>>> hi = '''hi
there'''
>>> hi # repr()
'hi\nthere'
>>> print hi # str()
hi
there
- 使用 Python 的 Unicode-Escape 编码
>>> u'Hello\u0020World !'
u'Hello World !'
Python 列表(List)
- 使用 del 语句来删除列表的的元素:
#!/usr/bin/python
list1 = ['physics', 'chemistry', 1997, 2000];
print list1;
del list1[2];
print "After deleting value at index 2 : "
print list1;
- 以上实例输出结果:
['physics', 'chemistry', 1997, 2000]
After deleting value at index 2 :
['physics', 'chemistry', 2000]
- L[-2]读取列表中倒数第二个元素
Python 元组
-
创建空元组
tup1 = (); -
元组中只包含一个元素时,需要在元素后面添加逗号
tup1 = (50,); -
元组中的元素值是不允许修改的,但我们可以对元组进行连接组合
-
元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组
Python 字典(Dictionary)
-
字典是另一种可变容器模型,且可存储任意类型对象。
-
键必须是唯一的,但值则不必。
-
值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
-
一个简单的字典实例:
dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
删除字典元素
- 能删单一的元素也能清空字典,清空只需一项操作。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
del dict['Name']; # 删除键是'Name'的条目
dict.clear(); # 清空词典所有条目
del dict ; # 删除词典
print "dict['Age']: ", dict['Age'];
print "dict['School']: ", dict['School'];
Python 日期和时间
- Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。
- Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。
- 时间间隔是以秒为单位的浮点小数。
- 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示。
- Python 的 time 模块下有很多函数可以转换常见日期格式。
- time.time()用于获取当前时间戳, 如下实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time; # 引入time模块
ticks = time.time()
print "当前时间戳为:", ticks
以上实例输出结果:
当前时间戳为: 1459994552.51
- 什么是时间元组?很多Python函数用一个元组装起来的9组数字处理时间:
获取当前时间
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time
localtime = time.localtime(time.time())
print "本地时间为 :", localtime
以上实例输出结果:
本地时间为 : time.struct_time(tm_year=2016, tm_mon=4, tm_mday=7,
tm_hour=10, tm_min=3, tm_sec=27, tm_wday=3, tm_yday=98, tm_isdst=0)
获取格式化的时间asctime():
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time
localtime = time.asctime( time.localtime(time.time()) )
print "本地时间为 :", localtime
以上实例输出结果:
本地时间为 : Thu Apr 7 10:05:21 2016
格式化日期
- 我们可以使用 time 模块的 strftime 方法
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time
# 格式化成2016-03-20 11:45:39形式
print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 格式化成Sat Mar 28 22:24:24 2016形式
print time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())
# 将格式字符串转换为时间戳a = "Sat Mar 28 22:24:24 2016"
print time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))
以上实例输出结果:
2016-04-07 10:25:09
Thu Apr 07 10:25:09 2016
1459175064.0
获取某月日历
- Calendar模块
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import calendar
cal = calendar.month(2016, 1)
print "以下输出2016年1月份的日历:"
print cal;
以上实例输出结果:
以下输出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
Python 函数
- 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 定义函数
def printme( str ):
"打印任何传入的字符串"
print str;
return;
# 调用函数
printme("我要调用用户自定义函数!");
printme("再次调用同一函数");
以上实例输出结果:
我要调用用户自定义函数!
再次调用同一函数
按值传递参数和按引用传递参数
- 所有参数(自变量)在Python里都是按引用传递。如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 可写函数说明
def changeme( mylist ):
"修改传入的列表"
mylist.append([1,2,3,4]);
print "函数内取值: ", mylist
return
# 调用changeme函数
mylist = [10,20,30];
changeme( mylist );
print "函数外取值: ", mylist
传入函数的和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:
函数内取值: [10, 20, 30, [1, 2, 3, 4]]
函数外取值: [10, 20, 30, [1, 2, 3, 4]]
参数
-以下是调用函数时可使用的正式参数类型:
-
必备参数
-
关键字参数
-
默认参数
-
不定长参数
-
必备参数
必备参数须以正确的顺序传入函数。 -
关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。 -
缺省参数
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。 -
不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 可写函数说明
def printinfo( arg1, *vartuple ): "打印任何传入的参数"
print "输出: " print arg1
for var in vartuple:
print var
return;
# 调用printinfo 函数
printinfo( 10 );
printinfo( 70, 60, 50 );
以上实例输出结果:
输出:
10
输出:
70
60
50
匿名函数
- python 使用 lambda 来创建匿名函数。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2;
# 调用sum函数
print "相加后的值为 : ", sum( 10, 20 )
print "相加后的值为 : ", sum( 20, 20 )
以上实例输出结果:
相加后的值为 : 30
相加后的值为 : 40
Python 模块
- 模块让你能够有逻辑地组织你的Python代码段。
- 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂。
- 模块也是Python对象,具有随机的名字属性用来绑定或引用。
- 简单地说,模块就是一个保存了Python代码的文件。模块能定义函数,类和变量。模块里也能包含可执行的代码。
import 语句
- 想使用Python源文件,只需在另一个源文件里执行import语句,语法如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 导入模块
import support # 现在可以调用模块里包含的函数
support.print_func("Zara")
以上实例输出结果:
Hello : Zara
- 一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
From…import 语句
- Python的from语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下:
例如,要导入模块fib的fibonacci函数,使用如下语句:
from fib import fibonacci
- From…import* 语句
- 把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
from modname import *
这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。
命名空间和作用域
-
命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。
-
一个Python表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。
-
global VarName的表达式会告诉Python, VarName是一个全局变量,这样Python就不会在局部命名空间里寻找这个变量了。
dir()函数
- dir()函数一个排好序的字符串列表,内容是一个模块里定义过的名字。
返回的列表容纳了在一个模块里定义的所有模块,变量和函数。如下一个简单的实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 导入内置math模块
import math
content = dir(math)
print content;
以上实例输出结果:
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 'atan2',
'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod',
'frexp', 'hypot', 'ldexp', 'log','log10', 'modf', 'pi', 'pow',
'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
globals()和locals()函数
- 根据调用地方的不同,globals()和locals()函数可被用来返回全局和局部命名空间里的名字。
- 如果在函数内部调用locals(),返回的是所有能在该函数里访问的命名。
- 如果在函数内部调用globals(),返回的是所有在该函数里能访问的全局名字。
两个函数的返回类型都是字典。所以名字们能用keys()函数摘取。
reload()函数
- 当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。
- 因此,如果你想重新执行模块里顶层部分的代码,可以用reload()函数。该函数会重新导入之前导入过的模块。语法如下:
reload(module_name)
在这里,module_name要直接放模块的名字,而不是一个字符串形式。
Python中的包
- 包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的Python的应用环境。
-考虑一个在Phone目录下的pots.py文件。这个文件有如下源代码:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def Pots():
print "I'm Pots Phone"
同样地,我们有另外两个保存了不同函数的文件:
Phone/Isdn.py 含有函数Isdn()
Phone/G3.py 含有函数G3()
现在,在Phone目录下创建file init.py:
Phone/__init__.py
- 当你导入Phone时,为了能够使用所有函数,你需要在init.py里使用显式的导入语句,如下:
from Pots import Pots
from Isdn import Isdn
from G3 import G3
当你把这些代码添加到init.py之后,导入Phone包的时候这些类就全都是可用的了。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 导入 Phone 包
import Phone
Phone.Pots()
Phone.Isdn()
Phone.G3()
以上实例输出结果:
I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone
网友评论