「人生苦短,我學python」是編程屆的名言。用python寫小腳本的便捷性,讓不少其餘語言的學習者把python看成輔助語言。擁有了某一個語言的功底,再來學習另一種語言應該是十分快速的。編程理念都十分類似,只是看看語言的差別性。帶着Java的基礎,學習Python,準備上路了。html
安裝好python環境後,運行win+R,輸入python直接進入python的交互頁面,這邊能夠進行數學運算。java
>>> 2+2
4
複製代碼
表1 數學操做符,優先級從高到低python
操做符 | 操做 | 例子 | 值 |
---|---|---|---|
** | 指數 | 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進行*操做,字符串會進行復制。bash
這邊插一段,在java中進行變量聲明的時候,須要指定變量類型,在python中不須要,可是python變量名也須要必定的規則。多線程
爲了讓int型的5能夠轉化成字符串類型,從而和字符串拼接,python提供了一些內置函數。
表2 一些python內置函數app
函數 | 做用 | 示例 |
---|---|---|
str() | 轉化類型爲字符串 | str(5) |
int() | 轉化類型爲整數 | int('5') |
float() | 轉化類型爲浮點數 | float('5') |
print() | 打印函數 | 略 |
input() | 讀取用戶輸入數據 | myName = input() |
len() | 內容長度 | len(myName) |
如今引入第四個數據類型,布爾值。python的布爾值也是有真或者假,可是python中的真爲True(注意T必須大寫),假爲False(F也必須爲大寫),一樣的布爾類型不能與其餘類型相比較。dom
>>> 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 關鍵字;
一個變量名;
in 關鍵字;
調用 range()方法,最多傳入 3 個參數;
冒號;
從下一行開始,縮退的代碼塊(稱爲 for 子句)。
for i in range(5):
print('Jimmy Five Times (' + str(i) + ')')
複製代碼
i分別執行0、一、二、三、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])
複製代碼
>>> 'howdy' in ['hello', 'hi', 'howdy', 'heyas']
True
>>> spam = ['hello', 'hi', 'howdy', 'heyas']
>>> 'cat' in spam
False
複製代碼
>>> 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!'
複製代碼
嗚呼,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 的解析器)
結束。