1. 程式人生 > >黑馬程式設計師---Python基礎語法

黑馬程式設計師---Python基礎語法

Python作者,Guido van Rossum(吉多·範羅蘇姆)

學習一定要完整課程體系,要在linux下程式設計

程式設計技巧                         定義函式

先做什麼                         定義函式
再做什麼                
最後做什麼                      要幹什麼(呼叫函式)
推動不下去逆著推                輸出
先寫特殊情況,再加工,如找出特殊,再寫迴圈

規範:

1、類的方法第一個引數必須是self,而靜態方法第一個引數必須是cls。

2、儘可能使用‘is’‘is not’取代‘==’,比如if x is not None 要優於if x

3、異常中不要使用裸露的except,except後跟具體的exceptions

第一部分:基礎語法

預設情況下,Python 3 原始碼檔案以 UTF-8 編碼,所有字串都是 unicode 字串。

python程式中,中文支援    # -*- coding:utf-8 -*-

字串的擷取的語法格式如下:變數[頭下標:尾下標]

str='Runoob'
print(str[0:-1])           # 輸出第一個到倒數第二個的所有字元
print(str[0])              # 輸出字串第一個字元
print(str[2:])             # 輸出從第三個開始的後的所有字元
print(str * 2)             # 輸出字串兩次
print(str + '你好')        # 連線字串
print(str[::-1])           #倒序

空行: print(("\n\n按下 enter 鍵後退出。"))    記住:空行也是程式程式碼的一部分。

用 ''' ''' 的格式在三引號之間書寫較長的註釋,列印也能保持原樣。

多變數賦值:a, b, c = 1, 2, "runoob"

輸出函式解釋:

#coding=utf-8
def a():
    '''這是文件字串'''
    pass
print(a.__doc__)

字串輸出格式化 

print ("我叫%s今年%d歲!" % ('小明', 10))
print('{}網址: "{}!"'.format('菜鳥教程', 'www.runoob.com'))
print('{0} 和 {1}'.format('Google', 'Runoob'))
print('{1} 和 {0}'.format('Google', 'Runoob'))
print('{name}網址: {site}'.format(name='菜鳥教程', site='www.runoob.com'))
print('站點列表 {0}, {1}, 和 {other}。'.format('Google', 'Runoob',other='Taobao'))
print('常量 PI 的值近似為 {0:.3f}。'.format(math.pi))
print('數字 {0} 和 {1} 相加結果為: {2}'.format(1, 2, 3))
-----------------------------------
print("1234567890-------")   # 會在一行顯示
print("1234567890\n-------") # 一行顯示1234567890,另外一行顯示-------

/除   %取餘  //整除

注意事項

1、命名規範,命名不要和模組衝突  eg: json.py

2、is 用於判斷兩個變數引用物件是否為同一個(地址都要相同), == 用於判斷引用變數的值是否相等

3、pass是空語句,是為了保持程式結構的完整性,不可以省略,不然出錯,句末逗號也不能省略。

進階知識

字串方法:

>>> L=['a','b','c','d','e','f','g']
>>> print(L[::2])
['a', 'c', 'e', 'g']

列表表示式(通過 for 語句處理表達式裡面的變數,如果還要加條件,就加 if 條件就可以了。)

li = [1,2,3,4,5,6,7,8,9]
print ([x**2 for x in li])
print ([x**2 for x in li if x>5])
print (dict([(x,x*10) for x in li]))
print ([ (x, y) for x in range(10) if x % 2 if x > 3 for y in range(10) if y > 7 if y != 8 ])

字典

鍵必須是唯一的,但值則不必。

值可以取任何資料型別,但鍵必須是不可變的,如字串,數字或元組。

無窮巢狀 ,爬蟲已經json遇到過了

cities={
    '北京':{
        '朝陽':['國貿','CBD','天階','我愛我家','連結地產'],
        '海淀':['圓明園','蘇州街','中關村','北京大學'],
        '昌平':['沙河','南口','小湯山',],
        '懷柔':['桃花','梅花','大山'],
        '密雲':['密雲A','密雲B','密雲C']
    },
    '河北':{
        '石家莊':['石家莊A','石家莊B','石家莊C','石家莊D','石家莊E'],
        '張家口':['張家口A','張家口B','張家口C'],
        '承德':['承德A','承德B','承德C','承德D']
    }
}

for i in cities['北京']:
    print(i)

for i in cities['北京']['海淀']:
    print(i)

技巧:linux執行pycharm,可以寫指令碼,直接pycharm執行

$ cd pycharm/bin/
$ ./pycharm.sh

print用法

>> a=10;b=388;c=98
>>> print(a,b,c,sep='@')
[email protected]@98
#一排顯示
a, b = 0, 1
while b < 1000:
    print(b, end=',')
    a, b = b, a+b

while迴圈的格式

    i = 1
    while i<=9:  #滿足條件,一直迴圈
        j=1
        while j<=i:
            print("%d*%d=%-2d "%(j,i,i*j),end='') #不換行
            j+=1
        print('\n')  #顯示完在換行
        i+=1

九九乘法表思路,先列印排數,化繁為簡單,print()預設換行,end=‘’組織換行

祕訣:與產品經理與測試搞好關係

小總結:

  • continue的作用:用來結束本次迴圈,緊接著執行下一次的迴圈,break結束迴圈

條件為假:0, False, '', None   就是if a不成立條件

print([str(round(355/113, i)) for i in range(1, 6)])
['3.1', '3.14', '3.142', '3.1416', '3.14159']

什麼情況下需要使用 yield?

一個函式 f,f 返回一個 list,這個 list 是動態計算出來的(不管是數學上的計算還是邏輯上的讀取格式化),並且這個 list 會很大(無論是固定很大還是隨著輸入引數的增大而增大),這個時候,我們希望每次呼叫這個函式並使用迭代器進行迴圈的時候一個一個的得到每個 list 元素而不是直接得到一個完整的 list 來節省記憶體,這個時候 yield 就很有用。

字串方法   find   index  count(出現次數 ) replace  split切割   capitalize首轉大寫   

title 每個字母大寫   startswith   endswith   lower upper (大小寫轉換)  rfind(從右邊找)

rindex  join字串拼接  ,太多,自己去查

>>> a = "abcdef"
 >>> a[:3]
 'abc'
 >>> a[::2]
 'ace'
 >>> a[5:1:2] 
 ''
 >>> a[1:5:2]
 'bd'
 >>> a[::-2]
 'fdb' 
 >>> a[5:1:-2]
 'fd'

實現帶下標索引的遍歷

for chr in chars:
    print("%d %s"%(i, chr))  #自己加i
    i += 1
enumerate()  列舉
>>> chars = ['a', 'b', 'c', 'd']
>>> for i, chr in enumerate(chars):
...     print i, chr


返回值 return  用變數儲存  

小總結

  • 定義時小括號中的引數,用來接收引數用的,稱為 “形參”
  • 呼叫時小括號中的引數,用來傳遞給函式用的,稱為 “實參”

注意:帶有預設值的引數一定要位於引數列表的最後面。

lambda關鍵詞能建立小型匿名函式。這種函式得名於省略了用def宣告函式的標準步驟。用於自定義函式,作為函式內建引數

sum = lambda arg1, arg2: arg1 + arg2
#呼叫sum函式
print "Value of total : ", sum( 10, 20 )
stus = [
    {"name":"zhangsan", "age":18}, 
    {"name":"lisi", "age":19}, 
    {"name":"wangwu", "age":17}
]
按name排序:
>>> stus.sort(key = lambda x:x['name'])
>>> stus
[{'age': 19, 'name': 'lisi'}, {'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}]
按age排序:
>>> stus.sort(key = lambda x:x['age'])
>>> stus
[{'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}, {'age': 19, 'name': 'lisi'}]

包=模組+__init__.py

遞迴,函式不呼叫其他,呼叫本身

列表操作

"增"append, extend, insert
"查"in, not in, index, count
"刪"del, pop, remove
 排序sort, reverse

集合是一種魯棒性(健壯性)很好的資料結構,它與數學上的集合概念非常相似。

檔案操作 開啟關閉 寫  注意:如果檔案不存在那麼建立,如果存在那麼就先清空,然後寫入資料

#寫
with open('test.txt', 'w', encoding='utf-8') as f:
    f.write('test')
#讀
with open('test.txt', 'r', encoding='utf-8') as f:
    f.readlines()

獲取檔案字尾:
def getfile_fix(filename):
     return filename[filename.rfind('.')+1:]
print(getfile_fix('runoob.txt'))

資料夾的相關操作

有些時候,需要對檔案進行重新命名、刪除等一些操作,python的os模組中都有這麼功能

os.mkdir("張三")
os.getcwd()
os.listdir("./")
os.rmdir("張三")

應用:批量修改檔名,顯示所有視訊格式檔案,mp4,avi,rmvb……

面向物件

Python3 中類的靜態方法、普通方法、類方法

建立物件的格式為:

    物件名 = 類名()

  • BMW = Car(),這樣就產生了一個Car的例項物件,此時也可以通過例項物件BMW來訪問屬性或者方法
  • 第一次使用BMW.color = '黑色'表示給BMW這個物件新增屬性,如果後面再次出現BMW.color = xxx表示對屬性進行修改
  • BMW是一個物件,它擁有屬性(資料)和方法(函式)
  • 當建立一個物件時,就是用一個模子,來製造一個實物 

__init__()方法是在建立物件後,就立刻被預設呼叫了

class Car:
    def __init__(self, newWheelNum, newColor):
        self.wheelNum = newWheelNum
        self.color = newColor

    def __str__(self):
        msg = "嘿。。。我的顏色是" + self.color + "我有" + int(self.wheelNum) + "個輪胎..."
        return msg
    def move(self):
        print('車在跑,目標:夏威夷')

BMW = Car(4, "白色")
print(BMW)
  • 在python中方法名如果是__xxxx__()的,那麼就有特殊的功能,因此叫做“魔法”方法
  • 當使用print輸出物件的時候,只要自己定義了__str__(self)方法,那麼就會列印從在這個方法中return的資料

類由名稱。屬性(資料),方法構成(函式);

有一個物件,當需要對其進行修改屬性時,有2種方法

  • 物件名.屬性名 = 資料 ---->直接修改
  • 物件名.方法名() ---->間接修改

為了更好的儲存屬性安全,即不能隨意修改,一般的處理方式為

  • 將屬性定義為私有屬性
  • 新增一個可以呼叫的方法,供呼叫
class People(object):

    def __init__(self, name):
        self.__name = name

    def getName(self):
        return self.__name

    def setName(self, newName):
        if len(newName) >= 5:
            self.__name = newName
        else:
            print("error:名字長度需要大於或者等於5")

xiaoming = People("dongGe")
print(xiaoming.__name)

總結

  • 當有1個變數儲存了物件的引用時,此物件的引用計數就會加1
  • 當使用del刪除變數指向的物件時,如果物件的引用計數不會1,比如3,那麼此時只會讓這個引用計數減1,即變為2,當再次呼叫del時,變為1,如果再呼叫1次del,此時會真的把物件進行刪除

前面加——表示私有屬性,私有屬性,不能直接修改,用方法去改屬性
_del_預設刪除,結束前要做的事情,表示回收,節省資源
del引用計數變為0才會結束
多個物件指向同一物件,指向同一地址,相當於這物件有3個別名

 pass很重要,不然報錯怎麼都發現不了

通過例項(物件)去修改類屬性

class People(object):
    country = 'china' #類屬性


print(People.country)
p = People()
print(p.country)
p.country = 'japan' 
print(p.country)      #例項屬性會遮蔽掉同名的類屬性
print(People.country)
del p.country    #刪除例項屬性
print(p.country)

類方法

是類物件所擁有的方法,需要用修飾器@classmethod來標識其為類方法,對於類方法,第一個引數必須是類物件,一般以cls作為第一個引數(當然可以用其他名稱的變數作為其第一個引數,但是大部分人都習慣以'cls'作為第一個引數的名字,就最好用'cls'了),能夠通過例項物件和類物件去訪問。

class People(object):
    country = 'china'

    #類方法,用classmethod來進行修飾
    @classmethod
    def getCountry(cls):
        return cls.country

p = People()
print p.getCountry()    #可以用過例項物件引用
print People.getCountry()    #可以通過類物件引用

多型,方法同一個,現象不同,(物件不同)

類下面有例項方法和類方法(@classmethod),引數cls。類物件可以直接呼叫類屬性。例項物件能獲取例項屬性,方法。

標準庫

只需要簡單的功能,應該首先考慮字串方法,因為它們非常簡單,易於閱讀和除錯:

'tea for too'.replace('too', 'two')

日期和時間

datetime模組為日期和時間處理同時提供了簡單和複雜的方法。

支援日期和時間演算法的同時,實現的重點放在更有效的處理和格式化輸出。

異常捕獲:

  • 把可能出現問題的程式碼,放在try中
  • 把處理異常的程式碼,放在except中
#coding=utf-8
try:
    print('-----test--1---')
    open('123.txt','r') # 如果123.txt檔案不存在,那麼會產生 IOError 異常
    print('-----test--2---')
    print(num)# 如果num變數沒有定義,那麼會產生 NameError 異常
except (IOError,NameError): 
    #如果想通過一次except捕獲到多個異常可以用一個元組的方式
    # errorMsg裡會儲存捕獲到的錯誤資訊
    print(errorMsg)
  • 當捕獲多個異常時,可以把要捕獲的異常的名字,放到except 後,並使用元組的方式僅進行儲存

咱們應該對else並不陌生,在if中,它的作用是當條件不滿足時執行的實行;同樣在try...except...中也是如此,即如果沒有捕獲到異常,那麼就執行else中的事情
try...finally...語句用來表達這樣的情況:
在程式中,如果一個段程式碼必須要執行,即無論異常是否產生都要執行,那麼此時就需要使用finally。 比如檔案關閉,釋放鎖,把資料庫連線返還給連線池等。

小例子:

1、生成日曆

import calendar
# 輸入指定年月
yy = int(input("輸入年份: "))
mm = int(input("輸入月份: "))
# 顯示日曆
print(calendar.month(yy, mm))

2、今天昨天日期

import datetime

def getYesterday():
    today = datetime.date.today()
    print(today)
    oneday = datetime.timedelta(days=1)
    yesterday = today - oneday
    return yesterday
# 輸出
print(getYesterday())

相關推薦

黑馬程式設計師---Python基礎語法

Python作者,Guido van Rossum(吉多·範羅蘇姆) 學習一定要完整課程體系,要在linux下程式設計 程式設計技巧                         定義函式 先做什麼                         定義函式 再做什

黑馬程式設計師——java基礎語法的常見面試題

Java中針對整數常量提供了四種表現形式 A:二進位制由0,1組成。以0b開頭。B:八進位制由0,1,...7組成。以0開頭。C:十進位制由0,1,...9組成。整數預設是十進位制。D:十六進位制

黑馬程式設計師----Java基礎之反射

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之GUI

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之IO包中其它類

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎基礎之IO流

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之集合類(一)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之String類

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之多執行緒

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之面向物件(最終篇)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之面向物件(封裝 繼承 多型)(二)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之面向物件(封裝 繼承 多型)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----java基礎之面向物件

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師——Java基礎之函式與陣列

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師--Java基礎面試題整理

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">j

黑馬程式設計師——java基礎之string及集合

<span style="font-family:SimSun;font-size:18px;">class TreeSetDemo { public static void main(String[] args) { TreeSet ts = new TreeSet(); ts.

黑馬程式設計師_java基礎——異常及遞迴

黑馬程式設計師------- android培訓、java培訓、期待與您交流! ---------- 1:異常 (1)程式出現的不正常情況。(2)異常的體系結構:Throwable:Error:是嚴重的問題。比如記憶體溢位等。要改程式碼。Exception:非Runt

黑馬程式設計師——Java基礎---IO流(字元流、位元組流、轉換流、流操作規律)

三、字元編碼 字元編碼通過轉換流來完成。在兩個物件進行構造的時候,可以加入字符集(即編碼表),可傳入編碼表的有: 轉換流:InuputStreamReader和OutputStreamWriter。列印流:PrintStream和PrintWriter,只有輸出流。轉換流的編碼應用 可以將字元以指定編

黑馬程式設計師--OC基礎--類方法、物件方法和self的使用

1、類方法 (1)類方法就是一個方法,它的使用不需要使用者去建立一個類的例項進行呼叫而可以直接通過類名對方法進行呼叫。 宣告一個類方法的格式: +(返回值型別) 方法名:(引數1型別)引數1名稱 方法名:(引數2型別)引數2名稱; 例:

黑馬程式設計師_java基礎加強學習筆記之註解

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">j