主頁 > 後端開發 > Python基礎入門第一章

Python基礎入門第一章

2020-09-10 18:15:21 後端開發

 

既然學習 Python,那么至少得了解下這門語言,知道 Python 代碼執行程序吧,Python 的歷史有興趣的百度百科下就有,這個不多說了,

 

1、我們先來了解下什么是解釋型語言和編譯型語言?

計算機是不能夠識別高級語言的,所以當我們運行一個高級語言程式的時候,就需要一個“翻譯機”來從事把高級語言轉變成計算機能讀懂的機器語言的程序,這個程序分成兩類,第一種是編譯,第二種是解釋,

編譯型語言在程式執行之前,先會通過編譯器對程式執行一個編譯的程序,把程式轉變成機器語言,運行時就不需要翻譯,而直接執行就可以了,最典型的例子就是 C 語言,

解釋型語言就沒有這個編譯的程序,而是在程式運行的時候,通過解釋器對程式逐行作出解釋,然后直接運行,最典型的例子是 Ruby,

通過以上的例子,我們可以來總結一下解釋型語言和編譯型語言的優缺點,因為編譯型語言在程式運行之前就已經對程式做出了“翻譯”,所以在運行時就少掉了“翻譯”的程序,所以效率比較高,但是我們也不能一概而論,一些解釋型語言也可以通過解釋器的優化來在對程式做出翻譯時對整個程式做出優化,從而在效率上超過編譯型語言,

此外,隨著 Java 等基于虛擬機的語言的興起,我們又不能把語言純粹地分成解釋型和編譯型這兩種,用 Java 來舉例,Java 首先是通過編譯器編譯成位元組碼檔案,然后在運行時通過解釋器給解釋成機器檔案,所以我們說 Java 是一種先編譯后解釋的語言,再換成 C#,C# 首先是通過編譯器將 C# 檔案編譯成 IL 檔案,然后在通過 CLR 將 IL 檔案編譯成機器檔案,所以我們說 C# 是一門純編譯語言,但是 C# 是一門需要二次編譯的語言,同理也可等效運用到基于 .NET 平臺上的其他語言,

2、那么 Python 到底是什么?

其實 Python 和 Java、C# 一樣,也是一門基于虛擬機的語言,我們先來從表面上簡單地了解一下 Python 程式的運行程序,

當我們在命令列中輸入 python hello.py 時,其實是激活了 Python 的“解釋器”,告訴“解釋器”:你要開始作業了,可是在“解釋”之前,其實執行的第一項作業和 Java 一樣,是編譯,

熟悉 Java 的讀者可以想一下我們在命令列中如何執行一個 Java 的程式:

javac hello.java
java hello
復制代碼

只是我們在用 Eclipse 之類的 IDE 時,將這兩部給融合成了一部而已,其實 Python 也一樣,當我們執行python hello.py時,它也一樣執行了這么一個程序,所以我們應該這樣來描述 Python,Python 是一門先編譯后解釋的語言,

3、簡述 Python 的運行程序

在說這個問題之前,我們先來說兩個概念,PyCodeObject 和 pyc 檔案,

我們在硬碟上看到的 pyc 自然不必多說,而其實 PyCodeObject 則是 Python 編譯器真正編譯成的結果,我們先簡單知道就可以了,繼續向下看,

當 Python 程式運行時,編譯的結果則是保存在位于記憶體中的 PyCodeObject 中,當 Python 程式運行結束時,Python 解釋器則將 PyCodeObject 寫回到 pyc 檔案中,

當 Python 程式第二次運行時,首先程式會在硬碟中尋找 pyc 檔案,如果找到,則直接載入,否則就重復上面的程序,

所以我們應該這樣來定位 PyCodeObject 和 pyc 檔案,我們說 pyc 檔案其實是 PyCodeObject 的一種持久化保存方式,

最后:

  • “人生苦短,我用Python”

  • Python 的設計哲學是“優雅”、“明確”、“簡單”,

一、變數和字串

首先:Python 每個陳述句結束可以不寫分號 ;, 如 print('hello') 列印 hello

1.1 變數

有過編程基礎的話,變數就不用多說了,

變數的命名法:

  • 駝峰式命名法
  • 帕斯卡命名法

1.2 字串

1、基本介紹

單引號 ' '或者雙引號 " " 都可以,再或者 ''' ''' 三個引號,其中三個引號被用于過于長段的文字或者是說明,只要是三引號不完你就可以隨意換行寫下文字,

①字串直接能相加,如:

str1 = 'hi'
str2 = 'hello'
print(str1 + str2)

運行結果:

hi jaybo

②字串相乘,如:

string = 'bang!'
total = string * 3 

列印 total 結果:

bang!bang!bang!

2、字串的分片與索引

字串可以通過 string[x] 的方式進行索引、分片,

字串的分片實際可以看作是從字串中找出來你要截取的東西,復制出來一小段你要的長度,存盤在另一個地方,而不會對字串這個源檔案改動,分片獲得的每個字串可以看作是原字串的一個副本,

先看下面這段代碼:

name = 'My name is Mike'
print(name[0])
'M'
print(name[-4])
'M'
print(name[11:14]) # from 11th to 14th, 14th one is excluded
'Mik'
print(name[11:15]) # from 11th to 15th, 15th one is excluded
'Mike'
print(name[5:])
'me is Mike'
print(name[:5])
'My na'

如果感到困惑話,可以對照如下表格理解和分析:

 

 

:兩邊分別代表著字串的分割從哪里開始,并到哪里結束,

name[11:14]為例,截取的編號從第11個字符開始,到位置為14但不包含第14個字符結束,而像name[5:]這樣的寫法代表著從編號為5的字符到結束的字串分片,相反,name[:5]則代表著從編號為0的字符開始到編號為5但包含第5個字符分片,可能容易搞混,可以想象成第一種是從5到最后面,程式員懶得數有多少個所以就省略地寫,第二種是從最前面到5,同樣懶得寫0,所以就寫成了[:5]

3、字串的方法

  • replace 方法:第一個引數表示被替代部分,第二個引數表示替代成怎樣的字串,

  • 字串填空,如:

    city = input("write the name of city:"")
    url = "http://apistore.baidu.com/mri.../weather?citypiny={}.format(city)
    

4、問題

問題1:

num = 1
string = '1'
print(num + string)

上面代碼將出錯?

解釋:整數型不能和字串直接相加,可以先把該字串轉為整數型,再相加,即 int(string)

num = 1
string = '1'
print(num + int(string))

二、函式

舉些你可能已經使用過的函式例子:

判斷資料型別:type(str) 
字串型別資料轉為整數型:int(str)
...

通過觀察規律不難發現,Python 中所謂的使用函式就是把你要處理的物件放到一個名字后面的括號就可以了,簡單的來說,函式就是這么使用,可以往里面塞東西得到處理結果,這樣的函式在 Python 中還有這些:

 

 

以 Python3.5 版本為例,一個有 68 個這樣的函式,它們被稱為內建函式,這里內建的是指這些函式為安裝好了 Python 就可以使用,

2.1 函式格式

定義函式的格式:

 

 

其中,defreturn關鍵字

注意: 函式縮進后面的陳述句被稱為是陳述句塊,縮進是為了表名陳述句的邏輯與從屬關系,縮進這個問題不能忽視,否則會導致代碼無法成功運行,這里需要特別注意,

2.2 函式引數

①位置引數,舉例,看代碼:

def trapezoid_area(base_up, base_down, height):
    return 1/2 * (base_up + base_down) * height

接下來我們開始呼叫該函式:

trapezoid_area(1,2,3)

不難看出,填入的引數1,2,3分別對應著引數 base_up,base_down 和 height,這種傳入引數的方式被稱作為位置引數,

②關鍵詞引數:在函式呼叫的時候,將每個引數名稱后面賦予一個我們想要傳入的值,如呼叫 fun1 函式時候:fun1(a=1, b=2, c=3)

看下圖:

 

 

  • 第一行的函式引數按照反序傳入,因為是關鍵詞引數,所以并不影響函式正常運作;
  • 第二行的函式引數反序傳入,但是到了第三個卻變成了位置函式,遺憾的是這種方式是錯誤的語法,因為如果按照位置來傳入,最后一個應該是引數 height 的位置,但是前面 height 已經按照名稱傳入了值3,所以是沖突的,
  • 第三行的函式引數正序傳入,前兩個是以關鍵字的方式傳入,最后一個以位置引數傳入,但是位置引數不能再關鍵詞引數后面,所以是錯誤的,
  • 第四行的函式引數正序傳入,前兩個是以位置的方式傳入,最后一個以關鍵字引數傳入,這個函式是可以正常運行的,

③不定長引數

有時我們在設計函式介面的時候,可會需要可變長的引數,也就是說,我們事先無法確定傳入的引數個數,

Python 提供了一種元組的方式來接受沒有直接定義的引數,這種方式在引數前邊加星號 * ,如果在函式呼叫時沒有指定引數,它就是一個空元組,我們也可以不向函式傳遞未命名的變數,例如:

def print_user_info( name ,  age  , sex = '男' , * hobby):
    # 列印用戶資訊
    print('昵稱:{}'.format(name) , end = ' ')
    print('年齡:{}'.format(age) , end = ' ')
    print('性別:{}'.format(sex) ,end = ' ' )
    print('愛好:{}'.format(hobby))
    return;

# 呼叫 print_user_info 函式
print_user_info( '小明' , 25, '男', '打籃球','打羽毛球','跑步')

輸出的結果:

昵稱:小明 年齡:25 性別:男 愛好:('打籃球', '打羽毛球', '跑步')

通過輸出的結果可以知道,* hobby 是可變引數,且 hobby 其實就是一個 tuple (元祖),

可變長引數也支持關鍵引數,沒有被定義的關鍵引數會被放到一個字典里,這種方式即是在引數前邊加 **,更改上面的示例如下:

def print_user_info( name ,  age  , sex = '男' , ** hobby ):
    # 列印用戶資訊
    print('昵稱:{}'.format(name) , end = ' ')
    print('年齡:{}'.format(age) , end = ' ')
    print('性別:{}'.format(sex) ,end = ' ' )
    print('愛好:{}'.format(hobby))
    return;

# 呼叫 print_user_info 函式
print_user_info( name = '小明' , age = 25 , sex = '男', hobby = ('打籃球','打羽毛球','跑步'))

輸出的結果:

昵稱:小明 年齡:24 性別:男 愛好:{'hobby': ('打籃球', '打羽毛球', '跑步')}

通過對比上面的例子和這個例子,可以知道,* hobby 是可變引數,且 hobby 其實就是一個 tuple (元祖),** hobby是關鍵字引數,且 hobby 就是一個 dict (字典),

④ 只接受關鍵字引數

關鍵字引數使用起來簡單,不容易引數出錯,那么有些時候,我們定義的函式希望某些引數強制使用關鍵字引數傳遞,這時候該怎么辦呢?將強制關鍵字引數放到某個*引數或者單個*后面就能達到這種效果,比如:

def print_user_info( name , *, age, sex = '男' ):
    # 列印用戶資訊
    print('昵稱:{}'.format(name) , end = ' ')
    print('年齡:{}'.format(age) , end = ' ')
    print('性別:{}'.format(sex))
    return;

# 呼叫 print_user_info 函式
print_user_info( name = '小明' ,age = 25 , sex = '男' )

# 這種寫法會報錯,因為 age ,sex 這兩個引數強制使用關鍵字引數
#print_user_info( '小明' , 25 , '男' )
print_user_info('小明',age='22',sex='男')

通過例子可以看,如果 age , sex 不適用關鍵字引數是會報錯的,

2.3 匿名函式

有沒有想過定義一個很短的回呼函式,但又不想用 def 的形式去寫一個那么長的函式,那么有沒有快捷方式呢?

——答案是有的,

Python 使用 lambda 來創建匿名函式,也就是不再使用 def 陳述句這樣標準的形式定義一個函式,

匿名函式主要有以下特點:

  • lambda 只是一個運算式,函式體比 def 簡單很多,
  • lambda 的主體是一個運算式,而不是一個代碼塊,僅僅能在 lambda 運算式中封裝有限的邏輯進去,
  • lambda 函式擁有自己的命名空間,且不能訪問自有引數串列之外或全域命名空間里的引數,

基本語法:lambda [arg1 [,arg2,.....argn]]:expression

示例:

sum = lambda num1 , num2 : num1 + num2;
print( sum( 1 , 2 ) )

輸出的結果: 3

注意:盡管 lambda 運算式允許你定義簡單函式,但是它的使用是有限制的, 你只能指定單個運算式,它的值就是最后的回傳值,也就是說不能包含其他的語言特性了, 包括多個陳述句、條件運算式、迭代以及例外處理等等,

匿名函式中,有一個特別需要注意的問題,比如,把上面的例子改一下:

num2 = 100
sum1 = lambda num1 : num1 + num2 ;

num2 = 10000
sum2 = lambda num1 : num1 + num2 ;

print( sum1( 1 ) )
print( sum2( 1 ) )

你會認為輸出什么呢?第一個輸出是 101,第二個是 10001,結果不是的,輸出的結果是這樣:

10001
10001

這主要在于 lambda 運算式中的 num2 是一個自由變數,在運行時系結值,而不是定義時就系結,這跟函式的默認值引數定義是不同的,所以建議還是遇到這種情況還是使用第一種解法,

如果你沒有最新的python入門到實戰教程,可以去小編的Python解答交流群:1148633274 免費領取,相互討論學習

三、回圈與判斷

3.1 布爾運算式和判斷

Python 中的布爾型別值:TrueFlase 其中,注意這兩個都是首字母大寫,

但凡能夠產生一個布林值的運算式為布爾運算式

1 > 2 # False
1 < 2 <3 # True
42 != '42' # True
'Name' == 'name' # False
'M' in 'Magic' # True
number = 12
number is 12 # True

注1:不同型別的物件不能使用<><==>進行比較,卻可以使用==!=

注2:浮點型別和整數型別雖然是不同型別,但不影響比較運算,還有,不等于!= 可以寫作<>

話說,布爾型別可以比較嗎?如:True > Flase,回答是可以的,TureFlase 對于計算機就像是 1 和 0 一樣,所以結果是真,即True

3.2 條件控制

定義格式:

 

用一句話該結構作用:如果...條件是成立的,就做...;反之,就做...

所謂條件成立,指的是回傳值為True的布爾運算式,

3.3 回圈

①for 回圈

把 for 回圈所的事情概括成一句話就是:于...其中的每一個元素,做...事情,

列印九九乘法表:

for i in range(1, 10):
    for j in range(1, i+1):
        print('{}x{}={}\t'.format(i, j, i*j), end='')
    print()

運行結果:

1x1=1
2x1=2   2x2=4
3x1=3   3x2=6   3x3=9
4x1=4   4x2=8   4x3=12  4x4=16
5x1=5   5x2=10  5x3=15  5x4=20  5x5=25
6x1=6   6x2=12  6x3=18  6x4=24  6x5=30  6x6=36
7x1=7   7x2=14  7x3=21  7x4=28  7x5=35  7x6=42  7x7=49
8x1=8   8x2=16  8x3=24  8x4=32  8x5=40  8x6=48  8x7=56  8x8=64
9x1=9   9x2=18  9x3=27  9x4=36  9x5=45  9x6=54  9x7=63  9x8=72  9x9=81

②while 回圈

 

 

總結:只要...條件一成立,就一直做...

在回圈程序中,可以使用 break 跳過回圈,使用 continue 跳過該次回圈,

在 Python 的 while 回圈中,可以使用 else 陳述句,while … else 在回圈條件為 false 時執行 else 陳述句塊,如:

count = 0
while count < 3:
   print (count)
   count = count + 1
else:
   print (count)

運行結果:

0
1
2
3

有 while … else 陳述句,當然也有 for … else 陳述句,for 中的陳述句和普通的沒有區別,else 中的陳述句會在回圈正常執行完(即 for 不是通過 break 跳出而中斷的)的情況下執行,while … else 也是一樣,如:

for num in range(10,20):  # 迭代 10 到 20 之間的數字
   for i in range(2,num): # 根據因子迭代
      if num%i == 0:      # 確定第一個因子
         j=num/i          # 計算第二個因子
         print ('%d 是一個合數' % num)
         break            # 跳出當前回圈
   else:                  # 回圈的 else 部分
      print ('%d 是一個質數' % num)

運行結果:

10 是一個合數
11 是一個質數
12 是一個合數
13 是一個質數
14 是一個合數
15 是一個合數
16 是一個合數
17 是一個質數
18 是一個合數
19 是一個質數

四、資料結構

Python 有四種資料結構,分別是:串列、字典、元組、集合,我們先從整體上認識一下這四種資料結構:

list = [val1,val2,val3,val4] #串列
dict = {key1:val1,key2:val2} #字典
tuple = (val1,val2,val3,val4) #元組
set = {val1,val2,val3,val4}	#集合

4.1 串列(List)

  1. 串列中的每個元素都是可變的;

  2. 串列中的元素是有序的,也就是說每個元素都有一個位置;

  3. 串列中可以容納 Python 中的任何物件,如下:

    all_in_list = [
        1, #整數
        1.0, #浮點數
        'a word', #字串
        print(1), #函式
        True, #布林值
        [1,2], #串列中套串列
        (1,2), #元祖
        {'key':'value'} #字典
    ]
    

另外,對于資料的操作,最常見的為增刪改查,在此就省略了,網上找下相應函式練習下即可,

4.2 字典(Dict)

  1. 字典中資料必須是以鍵值對的形式出現的;

  2. 邏輯上講,鍵是不能重復的;

  3. 字典中的鍵(key)是不可變的,也就是無法修改的,而值(value)是可變的,可修改的,可以是任何物件,

    下面是個例子:

    NASDAQ_code = {
        'BIDU':'Baidu',
        'SINA':'Sina',
        'YOKU':'Youku'
    }
    

一個字典中鍵與值并不能脫離對方而存在,如果你寫成了 {'BIDU':} 會引發一個語法錯誤:invalid syntax

如果試著將一個可變(mutable)的元素作為 key 來構建字典,比如串列:key_test = {[]:'a Test'} ,則會報一個錯:unhashable type:'list'

同時字典中的鍵值不會重復,即便你這么做,相同的鍵值也只能出現一次:a = {'key':123,'key':123}

增刪改查操作,在此省略了,

備注:

  • 串列中用來添加多個元素的方法為extend,在字典中添加多個元素的方法為update()
  • 字典是不能切片的,即這樣的寫法是錯誤的:chart[1:4]

4.3 元組(Tuple)

元組可以理解為一個穩固版的串列,因為元組是不可以修改的,因此在串列中的存在的方法均不可以使用在元組上,但是元組是可以被查看索引的,方式和串列一樣,

letters = ('a, 'b', 'c', 'd')
letters[0]

相關的操作找代碼練習下即可,

4.4 集合(Set)

集合則更接近數學上集合的概念,每一個集合中是的元素是無序的、不重復的任意物件,我們可以通過集合去判斷資料的從屬關系,有時還可以通過集合把資料結構中重復的元素減掉,

集合不能被切片也不能被索引,除了做集合運算之外,集合元素可以被添加還有洗掉:

a_set = {1,2,3,4}
a_set.add(5)
a_set.discard(5)

4.5 資料結構的一些技巧

4.5.1 多重回圈

如下:

代碼演示:

for a, b in zip(num, str):
    print(b, 'is', a)
復制代碼

4.5.2 推導式

串列推導式的用法很好理解,可以簡單地看成兩部分,如下圖:

 

紅色虛線后面的是我們熟悉的 for 回圈的運算式,而虛線前面的可以認為是我們想要放在串列中的元素,

代碼演示:

a = []
for i in range(1, 11):
    a.append(i)

可以換成串列決議的方式來寫:

b = [i for i in range(1, 11)]

串列決議式不僅方便,并且在執行效率上要遠遠勝過前者,

如果你沒有最新的python入門到實戰教程,可以去小編的Python解答交流群:1148633274 免費領取,相互討論學習

五、類的理解

5.1 類的介紹

類的定義:

class CocaCola:
    formula = ['caffeine','sugar','water','soda']

使用 class 來定義一個類,就如同創建函式時使用的 def 定義一個函式一樣簡單,如上你可以看到定義了名為 CocaCola 的類,接著在縮進的地方有一個裝載著串列的變數的 formula,這個在類里面定義的變數就是類的變數,而類的變數有一個專有的術語,我們稱之為類的屬性,

類的屬性:

  • 類變數
  • 方法

①類的實體化:

coke_for_me = CocaCola()
coke_for_you = CocaCola()

②類變數屬性的參考:CocaCola.formulacoke_for_me.formula

類方法的使用:

class CocaCola:
    formula = ['caffeine','sugar','water','soda']
    def drink(self):
        print('Energy!')
coke = CocaCola()
coke.drink()

結果:

Energy!

5.2 self

我想很多人會有關注到這個奇怪的地方——似乎沒有派上任何用場的self引數,我們來說明下原理,其實很簡單,我們修改下上面的代碼:

class CocaCola:
    formula = ['caffeine','sugar','water','soda']
    def drink(coke):	# 把self改為coke
        print('Energy!')
coke = CocaCola()
coke.drink()

結果:

Energy!

怎么樣,有些頭緒了吧!這個引數其實就是被創建的實體本身,也就是將一個個物件作為引數放入函式括號內,再進一步說,一旦一個類被實體化,那么我們其實可以使用和與我們使用函式相似的方式:

coke = CocaCola
coke.drink() == CocaCola.drink(coke) #左右兩邊的寫法完全一致

被實體化的物件會被編譯器默默地傳入后面方法的括號中,作為第一個引數,上面兩個方法是一樣的,但我們更多地會寫成前面那種形式,其實self這個引數名稱是可以隨意修改的(編譯器并不會因此而報錯),

和函式一樣,類的方法也能有屬于自己的引數,如下:

class CocaCola:
    formula = ['caffeine','sugar','water','soda']
    def drink(self,how_much):
    
    if how_much == 'a sip':
        print('Cool~')
    elif how_much == 'whole bottle’:
        print('Headache!')
ice_coke = CocaCola()
ice_coke.drink('a sip')

結果:

Cool~

5.3 魔術方法

Python 的類中存在一些方法,被稱為「魔術方法」,_init_()就是其中之一,

class CocaCola():
    formula = ['caffeine','sugar','water','soda']
    def __init__(self):
        self.local_logo = '可口可樂'
    def drink(self): 
        print('Energy!')
coke = CocaCola()
print(coke.local_logo)

作用:在創建實體之前,它做了很多事情,說直白點,意味著即使你在創建實體的時候不去參考 init_() 方法,其中的陳述句也會先被自動的執行,這給類的使用提供了極大的靈活性,

class CocaCola:
    formula = ['caffeine','sugar','water','soda']
    def __init__(self,logo_name):
        self.local_logo = logo_name
    def drink(self):
        print('Energy!')
coke = CocaCola('????')
coke.local_logo
>>> 可口可樂

有過面向物件編程經驗很好理解了,也就是很多面向物件語言中的「建構式」,

5.4 類的繼承

如下代碼:

class CaffeineFree(CocaCola):
    caffeine = 0
    ingredients = [
        'High Fructose Corn Syrup',
        'Carbonated Water',
        'Phosphoric Acid',
        'Natural Flavors',
        'Caramel Color',
    ]
coke_a = CaffeineFree('Cocacola-FREE')
coke_a.drink()

表示 CaffeineFree 繼承了 CocaCola 類,

類中的變數和方法可以被子類繼承,但如需有特殊的改動也可以進行覆寫,

Q1:類屬性如果被重新賦值,是否會影響到類屬性的參考?

class TestA():
    attr = 1
obj_a = TestA()

TestA.attr = 24
print(obj_a.attr)

>>> 結果:24

A1:會影響,

Q2:實體屬性如果被重新賦值,是否會影響到類屬性的參考?

class TestA:
    attr = 1
obj_a = TestA()
obj_b = TestA()

obj_a.attr = 42
print(obj_b.attr)

>>> 結果:1

A2:不會影響,

Q3:類屬性實體屬性具有相同的名稱,那么.后面參考的將會是什么?

class TestA():
    attr =1
    def __init__(self):
        self.attr = 24

obj_a = TestA()

print(obj_a.attr)

>>> 結果:24

A3:類屬性賦值后的值,

總結:如圖所示,Python 中屬性的參考機制是自外而內的,當你創建了一個實體之后,準備開始參考屬性,這時候編譯器會先搜索該實體是否擁有該屬性,如果有,則參考;如果沒有,將搜索這個實體所屬的類是否有這個屬性,如果有,則參考,沒有那就只能報錯了,

 

六、使用第三方庫

6.1 安裝自己的庫

我們一般使用 pip 來進行第三方庫的安裝,那么自己的庫要怎么安裝呢?當然可以把自己的庫提交到 pip 上,但是還要添加一定量的代碼和必要的檔案才行,在這里我們使用一個更簡單的方法:

  1. 找到你的 Python 安裝目錄,找到下面的 site-packages 檔案夾;
  2. 記住你的檔案名,因為它將作為參考時的名稱,然后將你寫的 py 檔案放進去,

這個檔案夾應該有你所安裝的所有第三方庫,如果你并不清楚你的安裝路徑,可以嘗試使用如下方式搞清楚它究竟在哪里:

import sys
print(sys.path)
復制代碼

列印出來的會是一個串列,串列中的第四個將是你的庫安裝路徑所在,因此你也可以直接這么做:

import sys
print(sys.path[3])
復制代碼

6.2 安裝第三方庫

令人驚嘆的第三方庫

如果用手機來比喻編程語言,那么 Python 是一款智能機,正如含量的手機應用出現在 iOS、Android 平臺上,同樣有各種各樣的第三方庫為 Python 開發者提供了極大的便利,

當你想要搭建網站時,可以選擇功能全面的 Django、輕量的 Flask 等 web 框架;當你想寫一個小游戲的時候,可以使用 PyGame 框架;當你想做一個 爬蟲時,可以使用 Scrapy 框架;當你想做資料統計分析時,可以使用 Pandas 資料框架......這么多豐富的資源可以幫助我們高效快捷地做到想做的事,就不需要再重復造輪子了,

安裝第三方庫方式:

①最簡單的方式:在 PyCharm 中安裝

  1. 在 PyCharm 的選單中選擇:File --> Default Setting
  2. 搜索 project interpreter,選擇當前 python 版本,點擊“+”添加庫
  3. 輸入庫的名稱,勾選,并點擊 Install Package

在安裝成功后, PyCharm 會有成功提示,也可以在 project interpreter 這個界面中查看安裝了哪些庫,點“-”號就可以卸載不再需要的庫,

②最直接的方式:在終端/命令列中安裝

PyPI(Python Package Index)是 Python 官方的第三方庫的倉庫,PyPI 推薦使用 pip 包管理器來下載第三方庫,

  1. 安裝 pip

    在 Python 3.4 之后,安裝好 Python 環境就可以直接支持 pip,你可以在終端/命令列里輸入這句檢查一下:pip --version (前提電腦 path 路徑已經配置好了),如果顯示 pip 版本,就說明 pip 已經成功安裝了;如果發現沒有安裝,則根據不同系統如下方式安裝:

  2. 使用 pip 安裝庫

    在安裝好了 pip 之后,以后安裝庫,只需要在命令列里面輸入:pip3 install PackageName(注:如果你想要安裝到 Python 2 中,需要把 pip3 換成 pip),補充:

    pippip3都在Python36\Scripts\目錄下,如果同時裝有 python2 和 python3,pip 默認給python2 用,pip3指定給 python3 用,如果只裝有 python3,則pippip3是等價的,

    如果你安裝了 Python 2 和 3 兩種版本,可能會遇到安裝目錄的問題,可以換成:python3 -m pip install PackageName (注:如果你想安裝到 Python2 中,需要把 Python3 換成 Python)

    如果遇到權限問題,可以輸入:sudo pip install PackageName

    安裝成功之后會提示:Successfully insyalled PackageName

    一些常用的 pip 指令:

    # pip 使用格式:pip <command> [options] package_name
    
    pip install package_name==1.9.2	# 安裝指定版本的包
    pip install --upgrade package_name	# 更新指定的包
    pip uninstall package_name	# 卸載指定的包
    pip show package_name	# 查看所安裝包的詳細資訊
    pip list	# 查看所有安裝的包
    pip --help	# 查看幫助
    

補充:如果下載很慢,可以考慮更改 pip 下載源,國內鏡像有:

# 國內常用的鏡像
http://pypi.douban.com/simple/            # 豆瓣
http://mirrors.aliyun.com/pypi/simple/    # 阿里
https://pypi.tuna.tsinghua.edu.cn/simple  # 清華
http://pypi.mirrors.ustc.edu.cn/simple/   # 中國科學技術大學
http://pypi.hustunique.com/simple/        # 華中理工大學

更改方法:

  1. 臨時使用,添加 -i--index 引數:pip install -i http://pypi.douban.com/simple/ flask

  2. Linux下永久生效的配置方法

    cd $HOME  
    mkdir .pip  
    cd .pip
    sudo vim pip.conf  
    
    # 在里面添加,trusted-host 選項為了避免麻煩是必須的,否則使用的時候會提示不受信任  
    [global]
    index-url=https://pypi.tuna.tsinghua.edu.cn/simple
    
    [install]
    trusted-host=pypi.tuna.tsinghua.edu.cn 
    disable-pip-version-check=true
    timeout = 6000 
    
  3. Windows 下永久生效的配置方法

    # a、進入如下目錄(沒有此目錄或檔案就自己創建下)
    C:\Users\username\AppData\Local\pip
    或
    C:\Users\username\pip
    
    # b、創建 “pip.ini” 檔案(注意:以UTF-8 無BOM格式編碼),添加如下內容
    [global]
    index-url=https://pypi.tuna.tsinghua.edu.cn/simple
    
    [install]
    trusted-host=pypi.tuna.tsinghua.edu.cn 
    disable-pip-version-check=true
    timeout = 6000 
    

③最原始的方式:手動安裝

搜索你要安裝的庫的名字,這時候有 3 種可能:

  1. 第一種是 exe 檔案,這種最方便,下載滿足你的電腦系統和 Python 環境的對應的 exe,再一路點擊 next 就可以安裝,

  2. 第二種是 .whl 類檔案,好處在于可以自動安裝依賴的包,

    1. 到命令列輸入pip3 install whell 等待執行完成,不能報錯(Python 2 中要換成 pip)
    2. 從資源管理器中確認你下載的 .whl 類檔案的路徑,然后在命令列繼續輸入:cd C:\download,此處需要改為你的路徑,路徑的含義是檔案所在的檔案夾,不包含這個檔案名字本身,然后再命令列繼續輸入:pip3 install xxx.whlxxx.whl 是你下載的檔案的完整檔案名,
  3. 第三種是原始碼,大概都是 ziptar.ziptar.bz2 格式的壓縮包,這個方法要求用戶已經安裝了這個包所依賴的其他包,例如 pandas 依賴于 numpy,你如果不安裝 numpy,這個方法是無法成功安裝 pandas 的,

    1. 解壓包,進入解壓好的檔案夾,通常會看見一個 setup.py 的檔案,從資源管理器中確認你下載的檔案的路徑,打開命令列,輸入:cd C:\download 此處需要改為你的路徑,路徑的含義是檔案所在的檔案夾,不包含這個檔案名字本身
    2. 然后在命令列中繼續輸入:python3 setup.py install 這個命令,就能把這個第三方庫安裝到系統里,也就是你的 Python路徑,windows 大概是在 C:\Python3.5\Lib\site-packages

    注:想要卸庫的時候,找到 Python 路徑,進入 site-packages 檔案夾,在里面刪掉庫檔案就可以了,

     

都明白了嗎? 如果你有不清楚的可以進我的Python解答交流群:1148633274相互討論學習
---------本文來源于網路加上自己的見解,如有侵權,請聯系我洗掉

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/3036.html

標籤:Python

上一篇:WEB——專案開發流程(含需求分析)

下一篇:位元組跳動高質量面經(偏難)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more