继续跨PYTHON大门
第一篇入门文章写了一些python支持的一些基本特性,这一篇则是作为PYTHON入门(一)的续篇,在稍微高一点的层次上,帮助进行正式的入门
一、函数
- 函数通过def关键字定义,通过一个简单的例子迅速说明情况:
#!/usr/bin/python2
def Hello():
print "helloO0OooO0oo"
Hello()
上面简短的代码即完成了一个函数的定义和调用,输出结果自己想象
- 那不说废话,直接上形参,给函数一个输入口
#!/usr/bin/python2
def Hello(s1,s2):
print "helloO0OooO0oo",s1,s2
Hello("1",'ok')
Hello(2,'not ok')
输出的结果也是很容易想象到的:
root@hlf-virtual-machine:/home/hlf/mnt# ./hello.py
helloO0OooO0oo 1 ok
helloO0OooO0oo 2 not ok
- 局部变量
#!/usr/bin/python2
def Hello(x):
print "global i=",x
i=222
print "local i=",i
i=555
Hello(i)
print "global i=",i
输出结果为:
global i= 555
local i= 222
global i= 555
此代码以变量i为例,展示了局部变量i和全局变量i之间并不会相互干扰
- 若想要在函数里改变外面变量的值,则需要通过global的方式,在上个代码的基础上,只添加一句话即可:在定义函数的时候,加一个
global i
def Hello(x):
print "global i=",x
global i
i=222
print "local i=",i
这样,这个i就和外面的那个i连接在一起了,就可以读取和改变外面的变量i的值了
- 定义函数拥有默认参数值
#!/usr/bin/python2
def Hello(ss,i=2):
print ss*i
Hello("O")
Hello("O",5)
这个默认复制次数是2,可以更改为5,自己想象
需要注意的是,只有形参表后面的可以有默认值,即不能在函数声明形参的时候,先声明有默认值的,def Hello(ss="O",i):
这就是错的
- 定义函数使用关键参数
假如一个函数拥有很多参数,大部分参数希望使用默认值,而只想改动其中一两个参数的值的时候,可以通过名称对特定参数进行赋值,这样也就不必担心调用函数时参数的顺序了
#!/usr/bin/python2
def Hello(a,b=2,c=3):
print a,b,c
Hello(1)
Hello(1,0)
Hello(1,c=0) ; Hello(c=0,a=1)
输出的结果毫无悬念:
1 2 3
1 0 3
1 2 0
1 2 0
- return返回函数值
以一个例子迅速带过:
#!/usr/bin/python2
def Hello(a,b,c):
return a+b+c
print Hello(1,2,3)
- python函数有个有趣的docstrings ,可以看成是对函数的一种注释吧,但是外界调用这个函数的时候,可以将这个注释很方便的调用出来处理,举个栗子:
#!/usr/bin/python2
def printMax(x,y):
'''----------------------------------
max
----------------------------------'''
if x > y:
print x
else:
print y
printMax(3,5)
print printMax.__doc__
关注点在最后一行,很方便的就将里面的文档说明给打印出来了,输出的结果为:
5
----------------------------------
max
----------------------------------
当然我这种编写方式是乱写的,别人建议的文档说明编写格式为:第一行首字母大写,第二行空白,从第三行开始是详细描述,最后以句号结尾
二、模块
如果想要在其他程序中重用很多函数,那么就使用模块吧。模块基本上就是一个包含了所有定义的函数和变量的文件。为了在其他程序中重用模块,模块的文件名必须以.py为扩展名。
- 导入模块
#!/usr/bin/python2
import sys
for i in sys.argv:
print i
输出的结果为:
root@hlf-virtual-machine:/home/hlf/mnt# ./hello.py hello world
./hello.py
hello
world
可以看见程序import了一个sys模块,sys.argv的第0个元素就是名称,第一个元素是hello,第二个……
还可以打印出sys.path,是一堆路径,我理解的是在这些路径下才可以使用sys模块
- name属性
独自运行的python程序name为main,若是被调用的话,则不是main,hello.py内容如下:
#!/usr/bin/python2
if __name__=="__main__":
print "main"
else:
print "not main"
例如,在shell中输入python2进入python命令行,在命令行中输入import hello
,则输出not main
,直接在shell中执行python2 hello.py
,则可以输出main
- 创建自己的模块
创建模块,hello.py内容如下:
#!/usr/bin/python2
def string():
print "hello"
def num(a,b):
print a+b
version="1.0.0"
调用模块,新建一个main.py
#!/usr/bin/python2
import hello
hello.string()
hello.num(1,2)
print hello.version
通过命令chmod a+x main.py
给新文件权限,然后执行./main.py
,即可看到理想的结果
- 简化调用
将上个main.py程序可以进行简化,编写起来更舒心一些,main.py内容如下:
#!/usr/bin/python2
from hello import string,num,version
string()
num(1,2)
print version
- dir()函数,用于查看属性信息
在保留上述hello.py文件的基础上,从shell输入python2进入python命令行,在python命令行下,dir()函数可以看到当前导入的模块,以及dir(hello)的时候,可以查看hello.py内部的函数和变量
>>> dir()
[‘ builtins‘, ‘ doc‘, ‘ name‘, ‘ package‘]
>>> import hello
>>> dir()
[‘ builtins‘, ‘ doc‘, ‘ name‘, ‘ package‘, ‘hello’]
>>> dir(hello)
[‘ builtins‘, ‘ doc‘, ‘ file‘, ‘ name‘, ‘ package‘, ‘num’, ‘string’, ‘version’]
四、数据结构
- 1.列表list
如果存在一个list,就可以随意的添加、删除和搜索列表中的项目,由于可以添加和删除,所以列表这种数据类型是可以被改变的 -
- list的创建
num_list=[22,33,55,77,99]
num_list=[22,33,55,77,[1,2,3]]
用len(num_list)可以获取列表长度
列表里甚至可以放一个别的列表
- list的创建
-
- list类下的append方法
num_list.append(66)
num_list.append([1,2,3])
用于追加项目
- list类下的append方法
-
- del删除list的项目
del num_list[0]
删除指定位置的列表元素
- del删除list的项目
-
- list类下的sort方法
num_list.sort()
用于将列表分类排序
- list类下的sort方法
-
- 打印列表中的元素
for i in num_list:
print i
作为入门的话,列表的其他东西就先暂时不去看了,详细的list下的函数可以在python命令行里输入help(list),查看详细,再按按键Q可以退出help
- 2.元组
元组与列表十分相像,最大的区别就是元组是不可修改的 -
- 元组的创建
num_list=((1,2,3),22,33,55,77,99)
就是括号变了而已
- 元组的创建
-
- 元组的访问
num_list[0][1]
值是2
- 元组的访问
-
- 只有1个元素和0个元素的特殊情况的定义
num_list=()
num_list=(1,)
- 只有1个元素和0个元素的特殊情况的定义
-
- 元组通常用于打印
s="\"hi\""
j=99
print "s=%s,i=%d"%(s,j)
- 3.字典dict
个人理解就是键-值对,详细函数可以在python命令行里输入help(list) -
- 创建字典
num_list={"name ":"hlf","paswd":1234,11111:888}
len依然可以查看长度
- 创建字典
-
- 利用字典dict的items方法,打印出所有键值对
for name,addr in num_list.items():
print name,":",addr
-
- 依然是用del,删除元素
del num_list["paswd"]
- 依然是用del,删除元素
五、数据序列和引用
- 1.序列索引
假如有这样一个list:num_list=[11,22,33,44,55]
-
- 这样索引的结果是毫无疑问的:
num_list[0]=11
num_list[1]=22
- 这样索引的结果是毫无疑问的:
-
- 当然还可以反向进行索引,从尾部开始:
num_list[-1]=55
num_list[-2]=44
- 当然还可以反向进行索引,从尾部开始:
2.序列切片
序列切片,从名字就可以想象出功能了,即取出序列的一部分,元组、列表、字符串都是适用的
num_list[1:3]=[22,33]
从位置1开始,止于位置3(不包含位置3)
num_list[1:-2]
同上
num_list[:3]=[11,22,33]
默认从位置0开始
num_list[1:]=[22,33,44,55]
默认到最后结束3.对象与引用
看下面一段代码:
#!/usr/bin/python2
num_list=[11,22,33,44,55]
num1=num_list
num2=num_list[:]
del num_list[0]
print num1
print num2
按照其他编程语言的理解的话,num1和num2应该是一样的
但是在python中,这个num1=num_list
语句并不是赋值,只是给num_list(名称)引用的对象,增加一个num1(名称)而已,这样就相当于num1和num_list名称引用的是同一个对象,再通俗一点理解就是把这两个东西绑定在了一起
而num2=num_list[:]
这个语句才是将num_list中的数据拷贝到一个新num2中,也就是真正意义的赋值吧
这样一说的话,应该就可以猜出上面代码的num1和num2的输出结果了吧,num1=[22,33,44,55],num2=[11,22,33,44,55]
额,看来两批还是写不完呀,到这里的话,python基本的操作应该就已经没问题了,到现在都是根据函数和语句块设计程序(面向过程),还有一种把数据和功能结合的面向对象的编程理念。在编写大型程序或是寻求一个更加合适的解决方案的时候,面向对象的编程就很适合了,还要python入门(三)做一下入门的最后一步