繼承、多態及排序(python/java版)


 繼承

  1Java:繼承實質爲多態,多態解決繼承的尷尬

      單繼承,對象實例化過程很簡單

      對象實例化的過程:從祖父到自己的第一個構造方法實例化的過程

   A

    B extend A

    C extendBnew 

    C() Object--A--B--C

 

  2Python繼承代碼的複用

多繼承:默認子類不會調用父類的構造方法

                子類調用父類的構造方法:

1B1.__init__(self)           #任意指明調用

        2#super(C,self).__init__()    #從左的第一個

多態:方法重寫:從左(從下往上)到右重寫方法


python繼承代碼練習中:class C(B,B1)c.foo()

調用foo()順序:先到父類B中找是否有foo()如果有就調用

     如果沒有,到父類B1中找是否有foo()如果有就調用

     如果沒有

Python中構造方法不能重載

 

63.62.7版本的cmp函數:

python3 sorted取消了對cmp的支持。

sorted(iterablekey=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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章