「人生苦短,我學python」是編程屆的名言。用python寫小腳本的便捷性,讓很多其他語言的學習者把python當作輔助語言。擁有了某一個語言的功底,再來學習另外一種語言應該是十分快速的。編程理念都十分相似,只是看看語言的差異性。帶著Java的基礎,學習Python,準備上路了。
基礎的運算安裝好python環境後,運行win+R,輸入python直接進入python的交互頁面,這邊可以進行數學運算。
>>> 2+2
4
表1 數學操作符,優先級從高到低
操作符操作例子值**指數2 ** 38%取模/取餘數22 % 86//整除/商數取整22 // 82/除法22 / 82.75*乘法3 * 515-減法5 - 23+加法2 + 24由上面可以看出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內置函數
現在引入第四個數據類型,布爾值。python的布爾值也是有真或者假,但是python中的真為True(注意T必須大寫),假為False(F也必須為大寫),同樣的布爾類型不能與其他類型相比較。
>>> True
True
>>> true
Traceback (most recent call last):
File "<stdin>", line 1, 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 函數名(參數):
函數體
在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, 2, 3, 'A', 'B', 'C']
>>> ['X', 'Y', 'Z'] * 3
['X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', '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', 'hi', 'howdy', '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', 'dog', 5)
>>> list(('cat', 'dog', 5))
['cat', 'dog', 5]
>>> list('hello')
['h', 'e', 'l', 'l', 'o']
>>> spam = [0, 1, 2, 3, 4, 5]
>>> cheese = spam
>>> cheese[1] = 'Hello!'
>>> spam
[0, 'Hello!', 2, 3, 4, 5]
>>> cheese
[0, 'Hello!', 2, 3, 4, 5]
看上面的代碼,非常好理解,spam將引用複製給cheese,而不是複製的對象,所以對某個引用操作,都會改變那唯一的對象。如果想為cheese引用生成一個新的對象,就需要用到拷貝函數copy()和deepcopy()。其實就是java中的淺拷貝和深拷貝。
>>> import copy
>>> spam = ['A', 'B', 'C', 'D']
>>> cheese = copy.copy(spam)
>>> cheese[1] = 42
>>> spam
['A', 'B', 'C', 'D']
>>> cheese
['A', 42, 'C', '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()可以通過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', 'age': 5, '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 的解析器)
結束。