python編程-迭代器(類,方法,繼承),函數,數據結構,

a, b = 0, 1
while b < 10:
    print(b)   #print(b,end=',')
    a, b = b, a+b

相當於
n=b
m=a+b
a=n
b=m

輸出:
1
1
2
3
5
8

#輸出:
1,1,2,3,5,8

關鍵字end可以用於將結果輸出到同一行,或者在輸出的末尾添加不同的字符!

條件控制:

  • 1、每個條件後面要使用冒號 :,表示接下來是滿足條件後要執行的語句塊。
  • 2、使用縮進來劃分語句塊,相同縮進數的語句在一起組成一個語句塊。
  • 3、在Python中沒有switch – case語句。

循環:

for 實例中使用了 break 語句,break 語句用於跳出當前循環體:

continue語句,跳出本次循環,進行下一次循環;

range(初始值,終點值(取不到),步長)

 

迭代器

迭代是Python最強大的功能之一,是訪問集合元素的一種方式。

迭代器是一個可以記住遍歷的位置的對象。

迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。

迭代器有兩個基本的方法:iter() 和 next()

字符串,列表或元組對象都可用於創建迭代器:

#!/usr/bin/python3
 
list=[1,2,3,4]
it = iter(list)    # 創建迭代器對象
for x in it:
    print (x, end=" ")

1 2 3 4

創建一個迭代器

把一個類作爲一個迭代器使用需要在類中實現兩個方法 __iter__() 與 __next__() 。

如果你已經瞭解的面向對象編程,就知道類都有一個構造函數,Python 的構造函數爲 __init__(), 它會在對象初始化的時候執行。

更多內容查閱:Python3 面向對象

__iter__() 方法返回一個特殊的迭代器對象, 這個迭代器對象實現了 __next__() 方法並通過 StopIteration 異常標識迭代的完成。

__next__() 方法(Python 2 裏是 next())會返回下一個迭代器對象。

創建一個返回數字的迭代器,初始值爲 1,逐步遞增 1:

 

類實例化後,可以使用其屬性,實際上,創建一個類之後,可以通過類名訪問其屬性。

類對象支持兩種操作:屬性引用和實例化。

屬性引用使用和 Python 中所有的屬性引用一樣的標準語法:obj.name

類對象創建後,類命名空間中所有的命名都是有效屬性名。所以如果類定義是這樣:

#!/usr/bin/python3
 
class MyClass:
    """一個簡單的類實例"""
    i = 12345
    def f(self):
        return 'hello world'
 
# 實例化類
x = MyClass()
 
# 訪問類的屬性和方法
print("MyClass 類的屬性 i 爲:", x.i)
print("MyClass 類的方法 f 輸出爲:", x.f())

MyClass 類的屬性 i 爲: 12345
MyClass 類的方法 f 輸出爲: hello world

類有一個名爲 __init__() 的特殊方法(構造方法),該方法在類實例化時會自動調用,像下面這樣:

當然, __init__() 方法可以有參數,參數通過 __init__() 傳遞到類的實例化操作上。例如:

#!/usr/bin/python3
 
class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i)   # 輸出結果:3.0 -4.5

self代表類的實例,而非類

類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是 self。

class Test:
    def prt(self):
        print(self)
        print(self.__class__)
 
t = Test()
t.prt()


#輸出
<__main__.Test object at 0x0000028E52F59B00>
<class '__main__.Test'>

類的方法

在類的內部,使用 def 關鍵字來定義一個方法,與一般函數定義不同,類方法必須包含參數 self, 且爲第一個參數,self 代表的是類的實例。後續再使用def關鍵字時,就可以使用_init_中的self,但你不可以在已經定義的self外引用參數。更近一步,如果想要新加self參數,可以用類的繼承!

實例(Python 3.0+)
#!/usr/bin/python3
 
#類定義
class people:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類外部無法直接進行訪問
    __weight = 0
    #定義構造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說: 我 %d 歲。" %(self.name,self.age))
 
# 實例化類
p = people('runoob',10,30)
p.speak()

#輸出
runoob 說: 我 10 歲。

繼承

繼承Python 同樣支持類的繼承,如果一種語言不支持繼承,類就沒有什麼意義。

#!/usr/bin/python3
 
#類定義
class people:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類外部無法直接進行訪問
    __weight = 0
    #定義構造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說: 我 %d 歲。" %(self.name,self.age))
 
#單繼承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #調用父類的構函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆寫父類的方法
    def speak(self):
        print("%s 說: 我 %d 歲了,我在讀 %d 年級"%(self.name,self.age,self.grade))
 
 
 
s = student('ken',10,60,3)
s.speak()
執行以上程序輸出結果爲:

ken 說: 我 10 歲了,我在讀 3 年級

更多關於類的說明,點擊直達

總結:

#!/usr/bin/python3
 
class MyClass:
    """一個簡單的類實例"""
    i = 12345
    def f(self):
        return 'hello world'
 
# 實例化類
x = MyClass()
 
# 訪問類的屬性和方法
print("MyClass 類的屬性 i 爲:", x.i)
print("MyClass 類的方法 f 輸出爲:", x.f())


MyClass 類的屬性 i 爲: 12345
MyClass 類的方法 f 輸出爲: hello world

-------------------------------------------------------------------
類有一個名爲 __init__() 的特殊方法(構造方法),該方法在類實例化時會自動調用,
#!/usr/bin/python3
 
class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i)   # 輸出結果:3.0 -4.5


----------------------------------
#單繼承示例
class student(MyClass):
    grade = ''
    def __init__(self,n,a,w,g):
        #調用父類的構函
        MyClass.__init__(self,n,a,w)
        self.grade = g
    #覆寫父類的方法
    def speak(self):
        print("%s 說: 我 %d 歲了,我在讀 %d 年級"%(self.name,self.age,self.grade))
 
 
 
s = student('ken',10,60,3)
s.speak()
執行以上程序輸出結果爲:

ken 說: 我 10 歲了,我在讀 3 年級

函數

定義一個函數

你可以定義一個由自己想要功能的函數,以下是簡單的規則:

  • 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號 ()
  • 任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。
  • 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
  • 函數內容以冒號起始,並且縮進。
  • return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。
#!/usr/bin/python3
 
# 計算面積函數
def area(width, height):
    return width * height
 
def print_welcome(name):
    print("Welcome", name)
 
print_welcome("Runoob")
w = 4
h = 5
print("width =", w, " height =", h, " area =", area(w, h))
以上實例輸出結果:

Welcome Runoob
width = 4  height = 5  area = 20

匿名函數

python 使用 lambda 來創建匿名函數。

所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函數。

  • lambda 只是一個表達式,函數體比 def 簡單很多。
  • lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
  • lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間裏的參數。
  • 雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,後者的目的是調用小函數時不佔用棧內存從而增加運行效率。
#!/usr/bin/python3
 
# 可寫函數說明
sum = lambda arg1, arg2: arg1 + arg2
 
# 調用sum函數
print ("相加後的值爲 : ", sum( 10, 20 ))
print ("相加後的值爲 : ", sum( 20, 20 ))
以上實例輸出結果:

相加後的值爲 :  30
相加後的值爲 :  40

return語句

return [表達式] 語句用於退出函數,選擇性地向調用方返回一個表達式。不帶參數值的return語句返回None。之前的例子都沒有示範如何返回數值,以下實例演示了 return 語句的用法:

#!/usr/bin/python3
 
# 可寫函數說明
def sum( arg1, arg2 ):
   # 返回2個參數的和."
   total = arg1 + arg2
   print ("函數內 : ", total)
   return total
 
# 調用sum函數
total = sum( 10, 20 )
print ("函數外 : ", total)
以上實例輸出結果:

函數內 :  30
函數外 :  30

變量作用域

Python 中,程序的變量並不是在哪個位置都可以訪問的,訪問權限決定於這個變量是在哪裏賦值的。

變量的作用域決定了在哪一部分程序可以訪問哪個特定的變量名稱。Python的作用域一共有4種,分別是:

  • L (Local) 局部作用域
  • E (Enclosing) 閉包函數外的函數中
  • G (Global) 全局作用域
  • B (Built-in) 內置作用域(內置函數所在模塊的範圍)

以 L –> E –> G –>B 的規則查找,即:在局部找不到,便會去局部外的局部找(例如閉包),再找不到就會去全局找,再者去內置中找。

g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 閉包函數外的函數中
    def inner():
        i_count = 2  # 局部作用域

調用函數使用的是函數內部的局部變量,未調用函數,使用的是全局變量!

 

#!/usr/bin/python3
 
total = 0 # 這是一個全局變量
# 可寫函數說明
def sum( arg1, arg2 ):
    #返回2個參數的和."
    total = arg1 + arg2 # total在這裏是局部變量.
    print ("函數內是局部變量 : ", total)
    return total
 
#調用sum函數
print ("函數外是全局變量 : ", total)
sum( 10, 20 )


輸出
函數外是全局變量 :  0
函數內是局部變量 :  30

更多關於函數內容,點擊

數據結構

數據結構是編程的基礎,必須熟練掌握!

    特徵 常見用法
不可變數據 數字=123 用於計算,沒有索引;注意優先級(**》*/》not》and》or) >>> 17 % 3 # 取餘 
2
字符串='' Python 字符串不能被改變,可以添加索引
常用用法:+字符串,*2複製2遍

a='string'

a[0]='c' #非法

print(a[0]) #合法

print (a * 2)      # 輸出字符串兩次
print (a + "TEST") # 連接字符串

元組=() 元組(tuple)與列表類似,不同之處在於元組的元素不能修改。 tup1 = ()    # 空元組
tup2 = (20,) # 一個元素,需要在元素後添加逗號
可變數據 列表=[] 可以被索引,可以更改(不同於字符串),列表中元素的類型可以不相同,+,*依舊有效;

>>>a = [1, 2, 3, 4, 5, 6]
>>> a[0] = 9 #通過索引改列表

>>>del a[2] #刪除列表元素

字典={} 字典是無序的對象集合,不能通過索引,但可以通過鍵找值(鍵唯一);構造字典方法很多;

b={'adf':'www','eee':123}
#print (b[0]) #錯誤!字典是無序的,只能通過鍵來引用。
print (b['adf'])#合法

a={} #構造空字典

集合={} 集合區分其它數據類型很大一個特點就是:集合可以進行交集,差集,補集的運算。創建一個空集合必須用 set() 而不是 { },因爲 { } 是用來創建一個空字典

# set可以進行集合運算
a = set('abracadabra')
b = set('alacazam')
print(a)         #a是去除重複值

{'b', 'a', 'c', 'r', 'd'}#用{}拆分後表示
print(a - b)     # a 和 b 的差集

數據類型轉換 list()

list() 方法用於將元組,字符串,字典,集合轉換爲列表

其中,字符串轉換成列表,是將字符串中的每個字符轉換成列表的一個元素。

aTuple = (123, 'Google')
list1 = list(aTuple) #原組轉換列表
print ("列表元素 : ", list1)

列表元素 :  [123, 'Google']

tuple() tuple()將列表,字符串,字典,集合轉換爲元組;字符串都被單一拆分開來了;

list1= ['Google', 'Taobao']
b=tuple(list1)
print (b)

('Google', 'Taobao')

pandas DataFrame DataFrame是Python中Pandas庫中的一種數據結構,它類似excel,是一種二維表。

可由列表,字典創建

import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]}
df1= DataFrame(data)
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])

 

 

pandas series Series 是個定長的字典序列。Series有兩個基本屬性:index 和 values。
import pandas as pd
from pandas import Series, DataFrame
x1 = Series([1,2,3,4])
x2 = Series(data=[1,2,3,4], index=['a', 'b', 'c', 'd'])
numpy ndarray list 的元素在系統內存中是分散存儲的,而 NumPy 數組存儲在一個均勻連續的內存塊中,方便遍歷;此外,numpy矩陣運算採用多線程方式,可以提升計算效率。
import numpy as np
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

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