python 学习系列--任务3(函数,类以及sys模块等)
本次任务主要内容:
python脚本基础概念,涉及函数,类以及sys模块。
0x01 Python脚本框架
声明main()函数和自定义函数,学习编码声明的方式和main函数执行的方式。
Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行,这些代码,可以认为是Python的main函数。为了区分主执行文件还是被调用的文件,Python引入了一个变量name,当文件是被调用时,name的值为模块名,当文件被执行时,name为’main‘
新建一个hello.py脚本
# -*- coding:utf-8 -*-
import os
def foo(): #自定义函数
str='hhhhhh' #函数功能实现
print(str) #函数功能实现
print(__name__) #输出:__main__
def main(): #声明main()
foo()
if __name__=="__main__":
main() #main()先执行
foo()
#_name_是当前模块名,当模块被直接运行时模块名为_main_
执行结果:
为更好理解,建一个world.py调用hello模块
# -*- coding:utf-8 -*-
import hello
print(hello.__name__) #输出hello的名字
print(__name__) #输出world脚本的名字__main__
执行结果:
hello.py调用前后的name发生了变化,在定义的hello.py里,name是main,而在被调用之后,name变为hello。
0x02 函数
声明一个函数
def Function():
str='Joyeuse saint-valentin'
print(str)
函数调用
# -*- coding:utf-8 -*-
import os
def Function():
str='Joyeuse saint-valentin'
print(str)
def main():
output = Function()
print "Espèce de salaud"
if __name__=="__main__":
main()
执行结果:
$ python sys.py
Joyeuse saint-valentin
Espèce de salaud
0x03 Python类
类(Class): 用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法,对象是类的实例。
新建一个lei.py脚本,使用class创建类
import os
class Domain:#类名
def __init__(self, domain, port, protocol):
#定义一个方法,除第一个参数self外,其他和普通函数一样
self.domain=domain
self.port=port
self.protocol=protocol
def URL(self):
if self.protocol == 'https':
URL = 'https://'+self.domain+':'+self.port+'/'
if self.protocol == 'http':
URL = 'http://'+self.domain+':'+self.port+'/'
return URL
def lookup(self):
os.system("host "+self.domain)
#数据封装,面向对象编程的一个重要特点
#封装数据的函数是和类本身是关联起来的,称之为类的方法
创建实例,通过类名+()实现的,在终端python环境下,依次输入:
import lei
dom=lei.Domain('google.com', '443', 'https')
#创建Domain类的一个实例dom
dir(dom)
#要调用一个方法,只需要在实例变量上直接调用
dom.URL()
dom.ip#找不到ip呃
dom.port
dom.protocol
dom.lookup()
执行结果:
类是建实例的模板,实例是具体的对象,各实例的数据可不相同,通过在实例变量上调用方法,可直接操作对象内部的数据。
关于类的继承
继承是指面向对象编程 (OOP) 语言的一个主要功能:它可以使用现有类的所有功能,在无需重新编写原来的类的情况下对这些功能进行扩展。
继承的定义:
class human(object): # 定义一个父类
def saying(self): # 父类中的方法
print("La personne parle")
class person(human): # 定义一个子类, 继承human类
def walk(self): # 在子类中定义其自身的方法
print('babababab...')
a = person()
a.saying() # 调用继承的human类的方法
a.walk() # 调用本身的方法
输出:
La personne parle
babababab...
0x04 使用sys处理命令行输入值
sys模块,可以读取从命令终端输入的值并且可以引入到脚本里面。
sys.argv:传递给Python脚本的命令行参数列表。argv[0]是脚本名(是否为完整路径名取决于操作系统)。如果使用解释器的-c命令行选项执行命令,argv[0]被设置为字符串“-c”。如果没有将脚本名称传递给Python解释器,那么argv[0]就是空字符串。
实践操作一下:
import sys
print sys.argv[0]
print sys.argv[1]
print sys.argv[2]
运行结果:
$ python sys.py argv1 argv2
sys.py
argv1
argv2
sys模块的其他内容
①sys.exit(n)
执行到主程序末尾,解释器自动退出,如果需要中途退出,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序,0是正常退出。
import sys
print sys.argv[0]
print sys.argv[1]
sys.exit(0)
print sys.argv[2]
运行结果:
$ python sys.py argv1 argv2
sys.py
argv1
②sys.path
功能:获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到。
>>> import sys
>>> sys.path
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat
-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/
-dynload', '/usr/local/lib/python2.7/dist-packages'
'/home/antoine/libc', '/usr/lib/python2.7/dist-pack
ages']
>>>
③sys.stdin\stdout\stderr
stdin 、stdout 、stderr 变量包含与标准I/O 流对应的流对象。当print 不能满足要求, 可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们。
④sys.platform
获取当前系统平台。
>>> sys.platform
'linux2'
>>>