Python入门(二)

继续跨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类下的append方法
num_list.append(66)
num_list.append([1,2,3])
用于追加项目

del删除list的项目
del num_list[0]
删除指定位置的列表元素

list类下的sort方法
num_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,)

元组通常用于打印
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"]

五、数据序列和引用
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入门(三)做一下入门的最后一步。

本文转载自:long_fly的博客