繼承:
(1)Java:繼承實質爲多態,多態解決繼承的尷尬
單繼承,對象實例化過程很簡單
對象實例化的過程:從祖父到自己的第一個構造方法實例化的過程
A
B extend A
C extendBnew
C() Object--A--B--C
(2)Python:繼承代碼的複用
多繼承:默認子類不會調用父類的構造方法
子類調用父類的構造方法:
(1)B1.__init__(self) #任意指明調用
(2)#super(C,self).__init__() #從左的第一個
多態:方法重寫:從左(從下往上)到右重寫方法
如python繼承代碼練習中:class C(B,B1),c.foo()
調用foo()順序:先到父類B中找是否有foo()如果有就調用
如果沒有,到父類B1中找是否有foo()如果有就調用
如果沒有
在Python中構造方法不能重載
63.6和2.7版本的cmp函數:
python3 sorted取消了對cmp的支持。
sorted(iterable,key=None,reverse=False)
key接受一個函數,這個函數只接受一個元素,默認爲None
reverse是一個布爾值。如果設置爲True,列表元素將被倒序排列,默認爲False
着重介紹key的作用原理:
key指定一個接收一個參數的函數,這個函數用於從每個元素中提取一個用於比較的關鍵字。默認值爲None 。
例1:
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave','B', 10)]
sorted(students,key=lambda s: x[2]) #按照年齡來排序
結果:[('dave','B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
例2.這是一個字符串排序,排序規則:小寫<大寫<奇數<偶數
s = 'asdf234GDSdsf23' #排序:小寫-大寫-奇數-偶數
print("".join(sorted(s, key=lambda x: (x.isdigit(),x.isdigit() and int(x) % 2 == 0,x.isupper(),x))))
原理:先比較元組的第一個值,FALSE<TRUE,如果相等就比較元組的下一個值,以此類推。
先看一下Boolean value 的排序:
print(sorted([True,Flase]))===>結果[False,True]
Boolean 的排序會將 False 排在前,True排在後.
1.x.isdigit()的作用是把數字放在前邊,字母放在後邊.
2.x.isdigit() and int(x) % 2 == 0的作用是保證奇數在前,偶數在後。
3.x.isupper()的作用是在前面基礎上,保證字母小寫在前大寫在後.
4.最後的x表示在前面基礎上,對所有類別數字或字母排序。
最後結果:addffssDGS33224
例3:一道面試題:
list1=[7, -8, 5, 4, 0, -2, -5]
#要求1.正數在前負數在後 2.整數從小到大 3.負數從大到小
sorted(list1,key=lambda x:(x<0,abs(x)))
解題思路:先按照正負排先後,再按照大小排先後。
通過例子來說明sorted的用法:
1. 對由tuple組成的List排序
Python代碼
>>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),]
用key函數排序(lambda的用法見 註釋1)
Python代碼
>>> sorted(students, key=lambda student : student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
用cmp函數排序
Python代碼
>>> sorted(students, cmp=lambda x,y : cmp(x[2], y[2])) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
用 operator 函數來加快速度, 上面排序等價於:(itemgetter的用法見 註釋2)
Python代碼
>>> from operator import itemgetter, attrgetter
>>> sorted(students, key=itemgetter(2))
用 operator 函數進行多級排序
Python代碼
>>> sorted(students, key=itemgetter(1,2)) # sort by grade then by age
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
2. 對由字典排序
Python代碼
>>> d = {'data1':3, 'data2':1, 'data3':2, 'data4':4}
>>> sorted(d.iteritems(), key=itemgetter(1), reverse=True)
[('data4', 4), ('data1', 3), ('data3', 2), ('data2', 1)]
8迭代:
Yeild迭代生成器
__iter__()
__next__()
排序案例按照姓名年紀排序demo:
java版:
按姓名排序,姓名相同的按照age升序排列(排序原理:按照阿斯科碼a=97 b=96)
public class demo{
static class Person implements Comparable<Person>{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString(){
return String.format("我是%s,我今年%d歲!!",name,age);
}
@Override
public int compareTo(Person o) {
// TODO Auto-generated method stub
return this.name.compareTo(o.name)+o.age-this.age;相等返回0大於返回1小於返回-1
}
}
public static void main(String[] args) {
List<Person> ps=new ArrayList<>();
ps.add(new Person("張三",19));
ps.add(new Person("李四",17));
ps.add(new Person("張三",21));
ps.add(new Person("王五",23));
for(Person p:ps){
System.out.println(p);
}
System.out.println("-----------------排序後---------------");
Collections.sort(ps);
for (Person p:ps){
System.out.println(p);
}
}
運行結果:
-----------------排序前---------------
我是張三,我今年19歲!!
我是李四,我今年17歲!!
我是張三,我今年21歲!!
我是王五,我今年23歲!!
-----------------排序後---------------
我是張三,我今年21歲!!
我是張三,我今年19歲!!
我是李四,我今年17歲!!
我是王五,我今年23歲!!
----------華麗的分割線
python版
class person:
def __init__(self,name=None,age=None):
self.name=name
self.age=age
def __str__(self):
return "我是{0},今年{1}歲啦!!".format(self.name,self.age)
def __add__(self, other):
return person(self.name+other.name,self.age+other.age)
def __cmp__(self, other):
return self.name
p=person(name="張三",age=19)
p1=person(name="張三",age=19)
print(str(p)+" "+str(p1))
print(p+p1)
print("\n")
print("-----------------未排序------------------")
ps=[person("張三",19),person("李四",17),person("王五",21),person("張三",23),]
for p1 in ps:
print(p1)
print("-----------------排序後------------------")
for p1 in sorted(ps):
print(p1)