您的位置:首页 > 编程语言 > Python开发

Python 学习笔记(二):时间,函数,异常,面向对象

2016-08-08 11:42 846 查看

Python 日期和时间

Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。

时间间隔是以秒为单位的浮点小数。

时间戳

每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示。

时间戳单位最适于做日期运算

如函数time.time()用于获取当前时间戳

import time;  # 引入time模块

ticks = time.time()
print "当前时间戳为:", ticks


以上实例输出结果:

当前时间戳为: 1459994552.51


时间元组

Python函数用一个元组装起来的9组数字处理时间

也就是struct_time元组。这种结构具有如下属性



获取当前时间

!/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)


Time模块

Time 模块包含了以下内置函数,既有时间处理相的,也有转换时间格式的:



日历(Calendar)模块

此模块的函数都是日历相关的。

模块包含了以下内置函数:



Python 函数

定义一个函数

函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()

函数内容以冒号起始,并且缩进。

return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

以下为一个简单的Python函数,它将一个字符串作为传入参数,再打印到标准显示设备上。

def printme( str ):
"打印传入的字符串到标准显示设备上"
print str
return


参数

以下是调用函数时可使用的正式参数类型:

必备参数

关键字参数

默认参数

不定长参数

必备参数

必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

调用printme()函数,你必须传入一个参数,不然会出现语法错误:

def printme( str ):
"打印任何传入的字符串"
print str;
return;

printme();


以上实例输出结果:

Traceback (most recent call last):
File "test.py", line 11, in <module>
printme();
TypeError: printme() takes exactly 1 argument (0 given)


关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

以下实例在函数 printme() 调用时使用参数名:

def printinfo( name, age ):
"打印任何传入的字符串"
print ("Name: ", name);
print ("Age ", age);
return;

printinfo( age=50, name="miki" );


以上实例输出结果:

Name:  miki
Age  50


缺省参数

调用函数时,缺省参数的值如果没有传入,则被认为是默认值

下例会打印默认的age,如果age没有被传入:

def printinfo( name, age = 35 ):
"打印任何传入的字符串"
print "Name: ", name;
print "Age ", age;
return;

printinfo( age=50, name="miki" );
printinfo( name="miki" );


以上实例输出结果:

Name:  miki
Age  50Name:  miki
Age 35


不定长参数

你可能需要一个函数能处理比当初声明时更多的参数

这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名

加了星号(*)的变量名会存放所有未命名的变量参数。选择不多传参数也可

def printinfo( arg1, *vartuple ):
"打印任何传入的参数"
print "输出: "
print arg1
for var in vartuple:
print var
return;

printinfo( 10 );
printinfo( 70, 60, 50 );


以上实例输出结果:

输出:
10
输出:
70
60
50


匿名函数

python 使用 lambda 来创建匿名函数。

lambda的主体是一个表达式,而不是一个代码块仅仅能在lambda表达式中封装有限的逻辑进去

如下实例:

sum = lambda arg1, arg2: arg1 + arg2;

print "相加后的值为 : ", sum( 10, 20 )
print "相加后的值为 : ", sum( 20, 20 )


以上实例输出结果:

相加后的值为 :  30
相加后的值为 :  40


空函数

如果想定义一个什么事也不做的空函数,可以用pass语句

def nop():
pass


pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。

返回多个值(Python的函数返回多值其实就是返回一个tuple,但写起来更方便)

比如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的新的坐标:

import math

def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny


但其实这只是一种假象,Python函数返回的仍然是单一值:

>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)


原来返回值是一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。

Python 异常处理

python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。

异常处理

断言(Assertions)

异常处理

try/except语句

捕捉异常可以使用try/except语句。

try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。

如果你不想在异常发生时结束你的程序,只需在try里捕获它。

实例

面是简单的例子,它打开一个文件,在该文件中的内容写入内容,但文件没有写入权限,发生了异常:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功"
fh.close()


在执行代码前为了测试方便,我们可以先去掉 testfile 文件的写权限,命令如下:

chmod -w testfile


再执行以上代码:

$ python test.py
Error: 没有找到文件或读取文件失败


try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码。

Python 面向对象编程

创建类

class语句来创建一个新类,class之后为类的名称并以冒号结尾

以下是一个简单的Python类实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Employee:
'所有员工的基类'
empCount = 0

def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1

def displayCount(self):
print "Total Employee %d" % Employee.empCount

def displayEmployee(self):
print "Name : ", self.name,  ", Salary: ", self.salary


第一种方法_init_()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法

创建实例对象(不需要new关键字。特性)

创建一个类的实例,你可以使用类的名称,并通过init方法接受参数。

"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)


你可以动态添加,删除,修改类的属性(特性)

emp1.age = 7  # 添加一个 'age' 属性
emp1.age = 8  # 修改 'age' 属性
del emp1.age  # 删除 'age' 属性


Python内置类属性

dict : 类的属性(包含一个字典,由类的数据属性组成)

doc_ :类的文档字符串

name: 类名

module: 类定义所在的模块(类的全名是’main.className’,如果类位于一个导入模块mymod中,那么className.module 等于 mymod)

bases : 类的所有父类构成元素(包含了以个由所有父类组成的元组)

Python内置类属性调用实例如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Employee:
'所有员工的基类'
empCount = 0

def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1

def displayCount(self):
print "Total Employee %d" % Employee.empCount

def displayEmployee(self):
print "Name : ", self.name,  ", Salary: ", self.salary
print "Employee.__doc__:", Employee.__doc__
print "Employee.__name__:", Employee.__name__
print "Employee.__module__:", Employee.__module__
print "Employee.__bases__:", Employee.__bases__
print "Employee.__dict__:", Employee.__dict__


执行以上代码输出结果如下:

Employee.__doc__: 所有员工的基类
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: ()
Employee.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0x10a939c80>, 'empCount': 0, 'displayEmployee': <function displayEmployee at 0x10a93caa0>, '__doc__': '\xe6\x89\x80\xe6\x9c\x89\xe5\x91\x98\xe5\xb7\xa5\xe7\x9a\x84\xe5\x9f\xba\xe7\xb1\xbb', '__init__': <function __init__ at 0x10a939578>}


python对象销毁(垃圾回收)

同Java语言一样,Python使用了引用计数这一简单技术来追踪内存中的对象。

在Python内部记录着所有使用中的对象各有多少引用。

一个内部跟踪变量,称为一个引用计数器。

当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。但是回收不是”立即”的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。

实例

析构函数 deldel在对象销毁的时候被调用,当对象不再被使用时,del方法运行:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Point:
def __init__( self, x=0, y=0):
self.x = x
self.y = y
def __del__(self):
class_name = self.__class__.__name__
print class_name, "销毁"

pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # 打印对象的id
del pt1
del pt2
del pt3


以上实例运行结果如下:

3083401324 3083401324 3083401324
Point 销毁


类的继承

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。

需要注意的地方:继承语法 class 派生类名(基类名)://… 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。

在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。

在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数

Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Parent:        # 定义父类
parentAttr = 100
def __init__(self):
print "调用父类构造函数"

def parentMethod(self):
print '调用父类方法'

def setAttr(self, attr):
Parent.parentAttr = attr

def getAttr(self):
print "父类属性 :", Parent.parentAttr

class Child(Parent): # 定义子类
def __init__(self):
print "调用子类构造方法"

def childMethod(self):
print '调用子类方法 child method'

c = Child()          # 实例化子类
c.childMethod()      # 调用子类的方法
c.parentMethod()     # 调用父类方法
c.setAttr(200)       # 再次调用父类的方法
c.getAttr()          # 再次调用父类的方法


以上代码执行结果如下:

调用子类构造方法
调用子类方法 child method
调用父类方法
父类属性 : 200


基础重载方法



类属性与方法

类的私有属性

__private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

类的方法

在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数

类的私有方法

__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods

实例

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class JustCounter:
__secretCount = 0  # 私有变量
publicCount = 0    # 公开变量

def count(self):
self.__secretCount += 1
self.publicCount += 1
print self.__secretCount

counter = JustCounter()
counter.count()
counter.count()
print counter.publicCount
print counter.__secretCount  # 报错,实例不能访问私有变量


Python 通过改变名称来包含类名:

1
2
2
Traceback (most recent call last):
File "test.py", line 17, in <module>
print counter.__secretCount  # 报错,实例不能访问私有变量
AttributeError: JustCounter instance has no attribute '__secretCount'


Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName 访问属性,将如下代码替换以上代码的最后一行代码:

.........................
print counter._JustCounter__secretCount


执行以上代码,执行结果如下:

1
2
2
2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: