python学习笔记(五)

38、继承

子类继承父类时,如果不写init方法,表示继承父类的init方法。如果写了init方法,表示重写父类的init方法。其他方法也是同理。对于变量也是同样的道理。

class A:

def __init__(self):

self.a=”a”

self.b=”b”

def print(self):

print(self.a)

 

class B(A):

def __init__(self):

super(B,self).__init__()   //注意继承书写的格式,类名写自己的类,self不能缺少。

self.c=”c”

def print_b(self):

print(self.b)

39、日期运算

import datetime,time

计算两个日期之间的差值:

date5 = datetime.datetime.strptime('2012-9-22 12:35:40','%Y-%m-%d %H:%M:%S')
date6 = datetime.datetime.strptime('2015-9-22 10:35:40','%Y-%m-%d %H:%M:%S')

sep = date6 - date5

print(sep)

计算三天之后的日期:

now = datetime.datetime.now()
delta = datetime.timedelta(days=3)
n_days = now + delta
print(n_days.strftime('%Y-%m-%d %H:%M:%S'))

 其中strptime的类型是时间类,不是字符串格式。

date1 = time.ctime()              #为字符串,不能进行加减运算

date2 = datetime.date.today()      #date类,能与timedelta进行运算

date3 = datetime.datetime.now()   #datetime类,能与timedelta进行运算

虽然都能与timedelta进行运算,但是不能的类之间不能进行运算,如date2-date3

time.strptime(),datetime.datetime.strptime(),两者都是将字符串转换为时间类,但属于不同的类。

向一个开始输入框和结束输入框里输入时间,需要转换为string类型:

startTime = datetime.date.today()

startTimeStr = startTime.strftime()

endTime = startTime - datetime.tiemdelta(days=3)

endTimeStr = endTime.strftime()

40、日志模块

import logging

logging.basicConfig(filename="config.log",filemode="a",
                    format="%(asctime)s--%(name)s--%(levelname)s:%(message)s",level=logging.INFO)

console = logging.StreamHandler()
logging.getLogger().addHandler(console)

# 上面两行是将日志同时输出到console,方便调试。
logging.error("This is a error log.")
logging.info("This is a info log.")

41、python中的私有变量

(1)_xx,以单下划线开头的标识的protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标识为,如当使用 from M import * 时,不会将一个下划线开头的对象引入。

(2)__xx,双下划线的表示的是私有类型的变量。只能允许这个类本身进行访问,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变(在类FooBar内部,__boo变成_FooBar__boo,如self._FooBar__boo

(3)__xx__是定义特殊方法。用户控制的命名空间内的变量或是属性,如__init__,__import__或是__file__。只有当文档有说明时使用,不要自己定义这类变量。(就是说这些是python内部定义的变量名)

在这里强调一下私有变量,python默认的成员函数和成员变量都是公开的,没有像其他类似语言的publicprivate等关键字修饰,但是可以在变量前面加上两个下划线“__”,这样的话,函数或变量就变成私有的,这是python的已有变量轧压(这个翻译好拗口,英文名称是private name mangling

42、列表表达式和列表生成器

列表推导式有包含一个表达式的括号组成,表达式后面跟随一个for字句,之后可以有零个或多个forif字句,结果是一个列表,由表达式依据其后面的forif字句上下文计算而来的结果构成

a = [(x,y) for x in [1,2,3] for y in [2,3,5] if x!=y]

这样,a就生成了一个列表,每个元素是由xy构成的元组。

生成器表达式与列表表达式很像:m = ((x,y) for x in [1,2,3] for y in [2,3,5])

引用生成器表达式中的值:

print(m.__next__())

print(m.__next__())

总结:(1)把列表表达式的[]换成()得到的就是生成器表达式;(2)列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存。

43、列表中元素去重

列表有删除元素的方法,如list.pop(i)list.remove(value)del list[i]。有一点需要注意,每删除一个元素,后面的元素会自动前移一位,导致用for遍历的时候,每删除一个,后面的一个元素下标自动减1,使这个元素没被遍历到,从而出现遗漏。

要想删除列表中所有的重复元素,就不能简单的用for,而是用递归。如下:

list1 = [1,2,3,3,3,2,2,5,6,5,6]
def delDupli(list1):
    for i in list1:
        if list1.count(i) != 1:
            list1.remove(i)
            delDupli(list1)
delDupli(list1)
print(list1)

原文地址:https://www.cnblogs.com/yahutiaotiao/p/8030205.html