1. 程式人生 > 程式設計 >【Python雜貨鋪】速學python基礎

【Python雜貨鋪】速學python基礎

“人生苦短,我學python”是程式設計屆的名言。用python寫小指令碼的便捷性,讓很多其他語言的學習者把python當作輔助語言。擁有了某一個語言的功底,再來學習另外一種語言應該是十分快速的。程式設計理念都十分相似,只是看看語言的差異性。帶著Java的基礎,學習Python,準備上路了。

基礎的運算

安裝好python環境後,執行win+R,輸入python直接進入python的互動頁面,這邊可以進行數學運算。

>>> 2+2
4
複製程式碼

表1 數學操作符,優先順序從高到低

操作符 操作 例子
** 指數 2 ** 3 8
% 取模/取餘數 22 % 8 6
// 整除/商數取整 22 // 8 2
/ 除法 22 / 8 2.75
* 乘法 3 * 5 15
- 減法 5 - 2 3
+ 加法 2 + 2 4

由上面可以看出python前兩個基礎型別 整數浮點型別。這兩個和java中的概念差不多。

字串

作為基礎的型別,當然少不了字串了,和java一樣,字串可以進行拼接操作。例如:

>>> 'AAA' + 'BBB'
'AAABBB'
>>> 'CCC'+25
Traceback (most recent call last):
  File "<stdin>",line 1,in
<module> TypeError: can only concatenate str (not "int") to str >>> 'DEF'*3 'DEFDEFDEF' 複製程式碼

如上,‘AAA’+'BBB'可以直接進行字串的拼接。但是與java不同的是 python不會進行型別強制轉化,所以當用字串‘CCC’+int型的25的時候就會報錯。對python進行*操作,字串會進行復制。

變數名

這邊插一段,在java中進行變數宣告的時候,需要指定變數型別,在python中不需要,但是python變數名也需要一定的規則。

  1. 只能是一個詞。
  2. 只能包含字母、數字和下劃線。
  3. 不能以數字開頭。

型別轉化

為了讓int型的5可以轉化成字串型別,從而和字串拼接,python提供了一些內建函式。
表2 一些python內建函式

函式 作用 示例
str() 轉化型別為字串 str(5)
int() 轉化型別為整數 int('5')
float() 轉化型別為浮點數 float('5')
print() 列印函式
input() 讀取使用者輸入資料 myName = input()
len() 內容長度 len(myName)

控制流

布林值

現在引入第四個資料型別,布林值。python的布林值也是有真或者假,但是python中的真為True(注意T必須大寫),假為False(F也必須為大寫),同樣的布林型別不能與其他型別相比較。

>>> True
True
>>> true
Traceback (most recent call last):
  File "<stdin>",in <module>
NameError: name 'true' is not defined
>>> True = 1
  File "<stdin>",line 1
SyntaxError: can't assign to keyword
複製程式碼

比較型別

表3 比較型別

操作符 含義
== 等於
!= 不等於
< 小於
> 大於
<= 小於等於
>= 大於等於

同時python也可以使用二元操作符 andornot同java中的與、或、非。

條件與程式碼塊

你前面看到的布林表示式可以看成是條件,它和表示式是一回事。“條件”只是在 控制流語句的上下文中更具體的名稱。條件總是求值為一個布林值,True 或 False。控制 流語句根據條件是 True 還是 False,來決定做什麼。幾乎所有的控制流語句都使用條件。

程式碼塊

python沒有java中那種{}來區分程式碼塊,python中所有的程式碼塊都是通過縮排進行的。

  1. 縮排增加時,程式碼塊開始。
  2. 程式碼塊可以包含其他程式碼塊。
  3. 縮排減少為零,或減少為外面包圍程式碼塊的縮排,程式碼塊就結束了。
>>> if 'a'=='b':
...     print('真')
... else:
...     print('假')
...
假
複製程式碼

以上是一個if else 的控制流,條件後面加上冒號,並且程式碼塊需要縮排方式。

while迴圈的格式如下:

spam = 0
while spam < 5:
print('Hello,world.')
spam = spam + 1
複製程式碼

另外 python 也有break 和continue 關鍵字可以使用。

for迴圈

for迴圈單另兒拿出來以示尊重,for迴圈的格式如下:

for 關鍵字;
一個變數名;
in 關鍵字;
呼叫 range()方法,最多傳入 3 個引數;
冒號;
從下一行開始,縮退的程式碼塊(稱為 for 子句)。

for i in range(5):
    print('Jimmy Five Times (' + str(i) + ')')
複製程式碼

i分別執行0、1、2、3、4.

range()方法其實有三個引數,只是可以省略其中兩個。range(start、end、gap),可以指定開始、結束和步長。

>>> for i in range(0,10,3):
...     print(i)
...
0
3
6
9
複製程式碼

函式

匯入模組

Python 程式可以呼叫一組基本的函式,這稱為“內建函式”,包括你見到過的print()、input()和 len()函式。Python 也包括一組模組,稱為“標準庫”。每個模組都是一個 Python 程式,包含一組相關的函式,可以嵌入你的程式之中。例如,math模組有數學運算相關的函式,random 模組有隨機數相關的函式,等等。
利用import或者from import語句

自定義函式

除了內建函式,大部分的函式都是自定義的。(即使從模組中匯入的函式也是別人自定義好的,讓你使用的)

def hello(name):
 print('Hello ' + name)
複製程式碼

def 函式名(引數):
    函式體

None

在Python中有一個值稱為None,它表示沒有值。None是NoneType資料型別的唯一值(其他程式語言可能稱這個值為null、nil或 undefined)。就像布林值True和False一樣,None必須大寫首字母 N。

異常處理

def temp_convert(var):
    try:
        return int(var)
    except ValueError,Argument:
        print "引數沒有包含數字\n",Argument
複製程式碼

類似於java,python捕獲處理一場用的是try,except,只不過在except後面除了可以跟異常類(比如例子中的ValueError),還可以跟上引發一場的引數(比如例子中的Argument,其實就是try中的var)

列表

列表可以看作java中的陣列集合,可以存放一些元素,比如>>> spam = ['cat','bat','rat','elephant']。我們可以通過index獲取某個元素,比如spam[0]=‘cat’,同時可以從後往前拿資料,比如spam[-1]='elephant'。

切片

除了直接操作index,獲取某個元素之外,還可以通過切片獲得一段子列表。

>>> spam[1:3]
['bat','rat']
>>> spam[0:-1]
['cat','bat','rat']
複製程式碼

列表的拼接與複製

與java不同的是,python的列表可以自由的拼接複製。

>>> [1,2,3] + ['A','B','C']
[1,3,'A','C']
>>> ['X','Y','Z'] * 3
['X','Z','X','Z']
複製程式碼

列表結合某些關鍵字和方法

  1. 刪除某列表中的某元素,可以直接用del關鍵字。

  2. 也可以結合for迴圈

>>> supplies = ['pens','staplers','flame-throwers','binders']
>>> for i in range(len(supplies)):
print('Index ' + str(i) + ' in supplies is: ' + supplies[i])
複製程式碼
  1. 利用 in 、not in 直接判斷某元素是否在列表中
>>> 'howdy' in ['hello','hi','howdy','heyas']
True
>>> spam = ['hello','heyas']
>>> 'cat' in spam
False
複製程式碼
  1. index()方法判斷某元素在列表中的第一次出現的下標,沒有的話就報錯。
>>> spam = ['Zophie','Pooka','Fat-tail','Pooka']
>>> spam.index('Pooka')
1
複製程式碼
  1. 用 append()和 insert()方法在列表中新增值
    append()方法呼叫,將引數新增到列表末尾。insert()方法可以在列表任意下標處插入一個值。insert()方法的第一個引數是新值的下標,第二個引數是要插入的新值。

  2. 用remove()方法從列表中刪除值

  3. 用sort()方法將列表中的值排序

元組

在java中,我們知道String 是被final修飾的,所以String本身是不能修改的,如果對String進行修改,其實是在記憶體中新建了一個新的String。類似的python中也有一個不可修改的資料型別——元組。元組和列表差不多,很多方法都是共通的。只不過,元組是用"()"表示,並且元組內的元素不能被修改,也不能對元組進行增加刪除操作。

元組和列表的轉化

函式list()和tuple()將返回傳遞給它們的值的列表和元組版本。

>>> tuple(['cat','dog',5])
('cat',5)
>>> list(('cat',5))
['cat',5]
>>> list('hello')
['h','e','l','o']
複製程式碼

引用與引用函式

>>> spam = [0,1,4,5]
>>> cheese = spam
>>> cheese[1] = 'Hello!'
>>> spam
[0,'Hello!',5]
>>> cheese
[0,5]
複製程式碼

看上面的程式碼,非常好理解,spam將引用複製給cheese,而不是複製的物件,所以對某個引用操作,都會改變那唯一的物件。如果想為cheese引用生成一個新的物件,就需要用到拷貝函式copy()和deepcopy()。其實就是java中的淺拷貝和深拷貝。

>>> import copy
>>> spam = ['A','C','D']
>>> cheese = copy.copy(spam)
>>> cheese[1] = 42
>>> spam
['A','D']
>>> cheese
['A',42,'D']
複製程式碼

deepcopy()深拷貝是指,不僅生成一個與spam一樣新的物件,連spam內部的資料也一起復制一堆新的物件出來。就好比說把'A','B'這種元素分別換成一個個子列表,淺拷貝不會對他們複製,而深拷貝會對這些物件進行復制。

字典

像列表一樣,“字典”是許多值的集合。但不像列表的下標,字典的索引可以使用許多不同資料型別,不只是整數。字典的索引被稱為“鍵”,鍵及其關聯的值稱為“鍵-值”對。所以可以說字典就是java中的Map。

 myCat = {'size': 'fat','color': 'gray','disposition': 'loud'}
複製程式碼

與列表不同的是,字典沒有順序的概念,所以不能通過操作index獲取某元素,不能使用切片,不能使用排序函式。

操作字典

基本操作

所以操作字典,就需要另闢蹊徑,使用函式keys()、values()和 items()。顧名思義,分別是獲取字典的key值們,val值們,和鍵值對本身們。

>>> spam = {'color': 'red','age': 42}
>>> for v in spam.values():
        print(v)
red
42
>>> for k in spam.keys():
        print(k)
color
age
>>> for i in spam.items():
        print(i)
('color','red')
('age',42)
複製程式碼

值得一提的是 spam.keys()獲得的是元組,如果希望的到對應的列表就需要用list函式轉化。

檢查字典中是否存在鍵或值

可以利用in 或者not in 關鍵字判斷資料是否在字典中。

>>> spam = {'name': 'Zophie','age': 7}
>>> 'name' in spam.keys()
True
>>> 'Zophie' in spam.values()
True
>>> 'color' in spam.keys()
False
>>> 'color' not in spam.keys()
True
>>> 'color' in spam
False
複製程式碼

get()和setdefault()方法

get()可以通過key值找到相對應的value值。get有兩個引數,第一個引數是key值,第二個引數是在鍵值對不存在(或者說key不存在)的時候,給予的預設值。

>>> picnicItems = {'apples': 5,'cups': 2}
>>> 'I am bringing ' + str(picnicItems.get('cups',0)) + ' cups.'
'I am bringing 2 cups.'
>>> 'I am bringing ' + str(picnicItems.get('eggs',0)) + ' eggs.'
'I am bringing 0 eggs.'
複製程式碼

setdefault()有兩個引數,第一個是要插入鍵值對的key值,第二個是預設值。當原字典中有這個key值,就什麼也不做,如果原字典中沒有這個key值,就將預設值作為value,同key一起拼成鍵值對插入到字典中。

>>> spam = {'name': 'Pooka','age': 5}
>>> spam.setdefault('color','black')
'black'
>>> spam
{'color': 'black','age': 5,'name': 'Pooka'}
>>> spam.setdefault('color','white')
'black'
>>> spam
{'color': 'black','name': 'Pooka'}
複製程式碼

字串操作

我們早已經知道了字串和其基本操作了,當我們又學習了列表、元組、字典之後再來看一下更加豐富的處理字串的方法。

轉移字元和原始字元

和java一樣,python也是用 \ 對特殊字元進行轉義。同時,還有原始字元 r。可以在字串開始的引號之前加上r,使它成為原始字串。“原始字串”完全忽略所有的轉義字元,打印出字串中所有的倒斜槓。

>>> print(r'That is Carol\'s cat.')
That is Carol\'s cat.
複製程式碼

註釋與多行字元

python單行註釋可以使用特殊字元#,同時多行註釋可以使用""".

# 這是一行註釋
"""
這是多行註釋
這是多行註釋
這是多行註釋
"""
複製程式碼

有時候我們在使用print函式的時候,列印的字串很長很長,為了頁面好看,可以使用'''將大字串拆分成好幾行。

print('''Dear Alice,Eve's cat has been arrested for catnapping,cat burglary,and extortion.
Sincerely,Bob''')
複製程式碼

字串下標和切片

一個字串也可以當作列表來處理,其中元素可以看作是一個個字元。所以就可以對字串進行下標操作或者切片操作。同樣的就可以利用in、not in判斷某字元是否在字串內了。

>>> spam = 'Hello world!'
>>> spam[0]
'H'
>>> spam[4]
'o'
>>> spam[-1]
'!'
>>> spam[0:5]
'Hello'
>>> spam[:5]
'Hello'
>>> spam[6:]
'world!'
複製程式碼

一些字串內建方法

  1. upper() 字串全部變大寫
  2. lower() 字串全部變小寫
  3. isupper()字串至少有一個字母,並且所有字母都是大寫
  4. islower()字串至少有一個字母,並且所有字母都是小寫
  5. isalpha()字串只包含字母,並且非空
  6. isalnum()字串只包含字母和數字,並且非空
  7. isdecimal()字串只包含數字字元,並且非空
  8. isspace()字串只包含空格、製表符和換行,並且非空
  9. startswith()字串以該方法傳入的字串開始
  10. endswith()字串以該方法傳入的字串結束
  11. join()拼接字串,可指定分隔符
  12. split()通過某值切割字串
  13. rjust()左填充,如果輸出資料不足,補充空格
  14. ljust()右填充,如果輸出資料不足,補充空格
  15. center()字串居中,左右資料不足,補充空格

結束

嗚呼,python的基礎語法就算過了一遍,當然這只是基礎中的基礎。像python怎麼處理多執行緒、類的概念、記憶體管理等內容有時間再看吧。不忘初心,最開始學習python只是把它當作輔助語言,寫寫小指令碼什麼的,不打算研究太深,畢竟時間有限,java還有很多東西要去研究,並且,除了程式設計,這個世界還有很多美好的事情等待我去體驗。學以致用,寫爬蟲也是我學習python的一個動力,寫了一個小指令碼爬取豆瓣電影TOP250.(好像這個是爬蟲入門經典案例吧,哈哈)程式碼貼一下

import requests as rq
from bs4 import BeautifulSoup
import pandas as pd

def get_data(url):
    print(url)
    html = rq.get(url).content.decode("utf-8")
    soup = BeautifulSoup(html,"lxml")
    divItems = soup.find_all("div","item")

    for item in divItems:
        name = item.find('span',{'class':'title'}).text
        rating_num = item.find('span',{'class':'rating_num'}).text
        number = item.find('em').text
        imgUrl = item.find("img").attrs['src']
        print("----------->")
        print("number:"+number)
        numbers.append(number)

        print("name:"+name)
        names.append(name)

        print("rating_num:"+rating_num)
        rating_nums.append(rating_num)

        print("imgUrl:"+imgUrl)
        imgUrls.append(imgUrl)
        print("----------->")


data_df = pd.DataFrame()
numbers = []
names = []
rating_nums = []
imgUrls = []

for num in range(0,10):
    get_data("https://movie.douban.com/top250?start={}&filter=".format(int(num)*25))

data_df["序列"] = numbers
data_df["名稱"] = names
data_df["評分"] = rating_nums
data_df["海報"] = imgUrls
writer = pd.ExcelWriter('movie_top250.xlsx')
data_df.to_excel(writer,'page_1',float_format='%.5f')  # float_format 控制精度
writer.save()
複製程式碼

當然,提前需要install的模組 requests
BeautifulSoup4
pandas
openpyxl
lxml(BeautifulSoup4 的解析器)

結束。