Python零散函数
1. python json.dumps() json.dump()的区别
注意cat ,是直接输出文件的内容
load和loads都是实现“反序列化”,区别在于(以Python为例):
loads针对内存对象,即将Python内置数据序列化为字串
如使用json.dumps序列化的对象d_json=json.dumps({'a':1, 'b':2}),在这里d_json是一个字串'{"b": 2, "a": 1}'
d=json.loads(d_json) #{ b": 2, "a": 1},使用load重新反序列化为dict
load针对文件句柄
如本地有一个json文件a.json则可以d=json.load(open('a.json'))
相应的,dump就是将内置类型序列化为json对象后写入文件
2. sorted和sort
sorted(iterable, cmp=None, key=None, reverse=False)
3. 请定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。
class Person(object):
def __init__(self,name,gender,birth,**kw):
self.name = name
self.gender = gender
self.birth = birth
for key,value in kw.items():
setattr(self,key,value) xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student') print xiaoming.name
print xiaoming.job
34 请给 Person 类添加一个类属性 count,每创建一个实例,count 属性就加 1,这样就可以统计出一共创建了多少个 Person 的实例。
class Person(object):
count = 0
def __init__(self,name):
self.name = name
Person.count += 1 p1 = Person('Bob')
print Person.count p2 = Person('Alice')
print Person.count p3 = Person('Tim')
print Person.count
5. 类的私有变量不可以直接获取,但可以用方法实例或者类私有方法获取
# 通过实例的方法获取
class Person(object):
__count = 0
def __init__(self,name):
self.name = name
Person.__count += 1 def get_count(self):
return Person.__count p1 = Person('Alice')
p2 = Person('Tom') print p1.get_count()
# => 2 # 通过类私有方法获取
class Person(object):
__count = 0
def __init__(self,name):
self.name = name
Person.__count += 1 @classmethod
def get_count(self):
return self.__count p1 = Person('Alice')
p2 = Person('Tom') print Person.get_count()
# => 2
6. 类的继承和组合
每个类的定义都需要继承,没有的话,就从object继承
6.1 组合:has关系

6.2 继承:is关系

示例:
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender class Teacher(Person):
def __init__(self, name, gender, course):
super(Teacher,self).__init__(name,gender)
#或者Person.__init__(self,name,gender)
self.course = course
7. python中多态
类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从 Person 派生出 Student和Teacher ,并都写了一个 whoAmI() 方法:
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def whoAmI(self):
return 'I am a Person, my name is %s' % self.name class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
def whoAmI(self):
return 'I am a Student, my name is %s' % self.name class Teacher(Person):
def __init__(self, name, gender, course):
super(Teacher, self).__init__(name, gender)
self.course = course
def whoAmI(self):
return 'I am a Teacher, my name is %s' % self.name
在一个函数中,如果我们接收一个变量 x,则无论该 x 是 Person、Student还是 Teacher,都可以正确打印出结果:
def who_am_i(x):
print x.whoAmI() p = Person('Tim', 'Male')
s = Student('Bob', 'Male', 88)
t = Teacher('Alice', 'Female', 'English') who_am_i(p)
who_am_i(s)
who_am_i(t)
运行结果: I am a Person, my name is Tim
I am a Student, my name is Bob
I am a Teacher, my name is Alice
这种行为称为多态。也就是说,方法调用将作用在 x 的实际类型上。s 是Student类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。
由于Python是动态语言,所以,传递给函数 who_am_i(x)的参数 x 不一定是 Person 或 Person 的子类型。任何数据类型的实例都可以,只要它有一个whoAmI()的方法即可:
class Book(object):
def whoAmI(self):
return 'I am a book'
这是动态语言和静态语言(例如Java)最大的差别之一。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用。
任务
Python提供了open()函数来打开一个磁盘文件,并返回 File 对象。File对象有一个read()方法可以读取文件内容:
例如,从文件读取内容并解析为JSON结果:
import json
f = open('/path/to/file.json', 'r')
print json.load(f)
由于Python的动态特性,json.load()并不一定要从一个File对象读取内容。任何对象,只要有read()方法,就称为File-like Object,都可以传给json.load()。
请尝试编写一个File-like Object,把一个字符串 r'["Tim", "Bob", "Alice"]'包装成 File-like Object 并由 json.load() 解析。
答
import json class Students(object):
def read(self):
return '["Tim", "Bob", "Alice"]' s = Students() print json.load(s)
8. python 类的特殊方法

需要说明的是,对于单纯的数字可以用内建的cmp()函数进行sorted()
但如果不是单纯数字或者不是单纯字母,我们就需要自己定义__cmp__()
定义的__cmp__() 函数里面,可以使用cmp()进行优选排序,cmp()是升序,-cmp()是降序
示例
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def __str__(self):
return '(%s: %s)' % (self.name, self.score)
__repr__ = __str__
def __cmp__(self, s):
if self.score == s.score:
return cmp(self.name,s.name)
return -cmp(self.score,s.score)
L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 99)]
print sorted(L)
#返回结果:[(Alice: 99), (Tim: 99), (Bob: 88)]
还有一个__format__,可以见 python cook 第八章 P231,自己定义日期格式
根据书上,做的小练习
_formats = {'default':'{self.d1}-{self.d2}-{self.d3}'}
class Phone(object):
"""docstring for Phone"""
def __init__(self, Phone):
self.d1 = Phone[0:3]
self.d2 = Phone[3:7]
self.d3 = Phone[7:11]
def __format__(self,code):
if code == '':
code = 'default'
fmt = _formats[code]
return fmt.format(self=self)
s = Phone('')
print format(s)
类的@property
原文地址:http://www.imooc.com/code/6255
@property---这是关键字,固定格式,能让方法当“属性”用。
@score.setter---前面的"score"是@property紧跟的下面定义的那个方法的名字,"setter"是关键字,这种“@+方法名字+点+setter”是个固定格式与@property搭配使用。
使用@property 后 再使用@属性.setter,可以对该属性的值进行约束
如果有@property ,但是没有设置@属性.setter,那么这个属性只读,不可改
练习
class Student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
@property
def score(self):
return self.__score
@score.setter
def score(self, score):
if score < 0 or score > 100:
raise ValueError('invalid score')
self.__score = score
@property
def grade(self):
if self.score >= 80:
return 'A'
if self.score <60:
return 'C'
return 'B'
s = Student('Bob', 59)
print s.grade
s.score = 60
print s.grade
s.score = 99
print s.grade
__slots__ 允许存在的属性
原文:http://www.imooc.com/code/6256
注意:__slots__ 只对当前类起作用,子类中如果也要限制属性,也要自己定义__slots__,子类中定义自己要另外允许的属性即可
1. 父类__slots__ = ('name', 'gender'),子类无__slots__
那么:父类只能有'name', 'gender' 两个属性,子类属性无限制
2. 父类__slots__ = ('name', 'gender'),子类__slots__ = 'age'
那么:父类只能有'name', 'gender' 两个属性,子类只能有'name', 'gender' ,‘age’ 三个属性
给类中的变量属性执行类型检查或者合法性验证
@proterty
Python cook P237
对super的理解:
2. python cook P241
类变量和实例变量
变量查找的顺序:instance.__dict__ -> class.__dict__ -> baseclass.__dict__
类里的类方法、实例方法和静态方法
函数和方法的区别
函数(function):
1. 在外部def 定义的函数
2. 类内部定义的静态方法@staticmethod
方法(method):类里才有
1. @classmethod 定义的函数,第一个参数为cls,类本身
2. 实例函数,第一个参数为self
def fun1():
pass class cls1():
def fun1(self):
pass
@classmethod
def fun2(cls):
pass
@staticmethod
def fun3():
pass print fun1.__class__ #<type 'function'>
print cls1.fun1.__class__ #<type 'instancemethod'>
print cls1.fun2.__class__ #<type 'instancemethod'>
print cls1.fun3.__class__ #<type 'function'>
Python零散函数的更多相关文章
- Python中函数传递参数有四种形式
Python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...
- python的函数
函数一词起源于数学,但是在编程中的函数和数学中的有很大不同.编程中的函数式组织好的,可重复使用的,用于实现单一功能或相关联功能的代码块. 我们在学习过程中已经使用过一些python内建的函数,如pri ...
- python strip()函数 介绍
python strip()函数 介绍,需要的朋友可以参考一下 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除 ...
- python split()函数
Python split()函数 函数原型: split([char][, num])默认用空格分割,参数char为分割字符,num为分割次数,即分割成(num+1)个字符串 1.按某一个字符分割. ...
- Python数学函数
1.Python数学函数 1.abs(x):取绝对值,内建函数 2.math.ceil(x):向上取整,在math模块中 3.cmp(x,y):如果 x < y ,返回-1:如果 x == y ...
- Python回调函数用法实例详解
本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
- Python之函数与变量
本节内容 函数介绍及其作用 函数的定义与调用 函数的参数说明 全局变量与局部变量 值传递和引用传递 一.函数的介绍及其作用 编程语言中的函数与数学中的函数是有区别的:数学中的函数有参数(输入),就会有 ...
- Python基础-函数篇
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 函数与函数式编程 1.面向对象: 华山派-- ...
- 【C++实现python字符串函数库】strip、lstrip、rstrip方法
[C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...
随机推荐
- (十九)TableView的点击监听和数据刷新(Alert的多种样式) -tag传值的技巧
要实现监听,要使用代理,控制器要成为TableView的代理. 注意下面的方式是代理方法: - (void)tableView:(UITableView *)tableView didSelectRo ...
- hibernate关联对象的增删改查------增
本文可作为,北京尚学堂马士兵hibernate课程的学习笔记. 这一节,我们看看hibernate关联关系的增删改查 就关联关系而已,咱们在上一节已经提了很多了,一对多,多对一,单向,双向... 其实 ...
- 【面试笔试算法】Program 6: 字符消除(hiho题库)
时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1) ...
- Rest api简介
理解和使用内容协商 我们的开发者在发送一个 REST API 请求的同时,根据应用场景,针对相同的资源,可能会期待不同的返回形式. 比如,我希望根据用户客户端语言,同一个资源的内容可以返回不同的语言. ...
- 基于Oracle ADF的应用程序开发
ADF简介 ADF(Application Development Framework)是Oracle公司为简化J2EE程序开发的复杂性专门开发的一种解决方案,ADF通过减少实现设计模式和应用程序框架 ...
- Android监听自身卸载,弹出用户反馈调查
1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇博客,我将讲述一下一个各 ...
- android studio比较长用的几款插件
不懂安装studio插件,看参考博文:android stuido插件安装:http://blog.csdn.net/liang5630/article/details/46372447 1.Butt ...
- Sharepoint 2010 自定义WebService 找不到网站应用程序
错误描述:Net 开发WebService调用Microsoft.SharePoint.dll的服务器端对象模型,出现找不到网站的应用程序,或者出现500错误. 错误截图: [Webservice调用 ...
- Course3-Python文件I/O
1. 读取键盘输入 Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘.如下: 1). raw_input. raw_input([prompt]) 函数从标准输入读取一个行, ...
- C#逻辑面试题汇总【不断更新中】
(1)产生本月的月历,参考样式: 1 2 3 4 5 6 SU MO TU WE TH FR SA 01 02 03 04 05 06 07 08 09 10 11 12 13 14 ...