【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變數名也需要一定的規則。
- 只能是一個詞。
- 只能包含字母、數字和下劃線。
- 不能以數字開頭。
型別轉化
為了讓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也可以使用二元操作符 and、or、not同java中的與、或、非。
條件與程式碼塊
你前面看到的布林表示式可以看成是條件,它和表示式是一回事。“條件”只是在 控制流語句的上下文中更具體的名稱。條件總是求值為一個布林值,True 或 False。控制 流語句根據條件是 True 還是 False,來決定做什麼。幾乎所有的控制流語句都使用條件。
程式碼塊
python沒有java中那種{}來區分程式碼塊,python中所有的程式碼塊都是通過縮排進行的。
- 縮排增加時,程式碼塊開始。
- 程式碼塊可以包含其他程式碼塊。
- 縮排減少為零,或減少為外面包圍程式碼塊的縮排,程式碼塊就結束了。
>>> 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']
複製程式碼
列表結合某些關鍵字和方法
-
刪除某列表中的某元素,可以直接用del關鍵字。
-
也可以結合for迴圈
>>> supplies = ['pens','staplers','flame-throwers','binders']
>>> for i in range(len(supplies)):
print('Index ' + str(i) + ' in supplies is: ' + supplies[i])
複製程式碼
- 利用 in 、not in 直接判斷某元素是否在列表中
>>> 'howdy' in ['hello','hi','howdy','heyas']
True
>>> spam = ['hello','heyas']
>>> 'cat' in spam
False
複製程式碼
- index()方法判斷某元素在列表中的第一次出現的下標,沒有的話就報錯。
>>> spam = ['Zophie','Pooka','Fat-tail','Pooka']
>>> spam.index('Pooka')
1
複製程式碼
-
用 append()和 insert()方法在列表中新增值
append()方法呼叫,將引數新增到列表末尾。insert()方法可以在列表任意下標處插入一個值。insert()方法的第一個引數是新值的下標,第二個引數是要插入的新值。 -
用remove()方法從列表中刪除值
-
用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!'
複製程式碼
一些字串內建方法
- upper() 字串全部變大寫
- lower() 字串全部變小寫
- isupper()字串至少有一個字母,並且所有字母都是大寫
- islower()字串至少有一個字母,並且所有字母都是小寫
- isalpha()字串只包含字母,並且非空
- isalnum()字串只包含字母和數字,並且非空
- isdecimal()字串只包含數字字元,並且非空
- isspace()字串只包含空格、製表符和換行,並且非空
- startswith()字串以該方法傳入的字串開始
- endswith()字串以該方法傳入的字串結束
- join()拼接字串,可指定分隔符
- split()通過某值切割字串
- rjust()左填充,如果輸出資料不足,補充空格
- ljust()右填充,如果輸出資料不足,補充空格
- 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 的解析器)
結束。