Python猜數小遊戲
【遊戲規則】生成一個指定範圍的隨機數(如:1-100),然後玩家輸入數值猜答案,屏幕會根據玩家輸入的數字給出大小提示,一直到玩家猜出準確答案則遊戲勝利並結束。
import random
answer=random.
randint(1,100)
n=
int(input("Please input num: "))
while n!=answer :
if
n>answer:
n =
int(input("Num is Big! Please Continue input: "))
elif n<answer:
n =
int(input("Num is small! Please Continue input: "))
print("You Win the game!")
Python 函數
函數概念
函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。 函數能提高應用的模塊性,和代碼的重復利用率。如print() range()函數,但你也可以自己創建函數,這被叫做用戶自定義函數。
函數定義
案例:定義一個函數Max_num(),用來比較兩個數字的大小,然後將數值大的數字返回。
- 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號()。
- 圓括號之間可以用於定義參數。
- 函數內容以冒號起始,並且縮進。
- return [表達式] 選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。
def Max_num (a,b):
if a>b:
return a
elif a<b:
return b
else:
return a
result=Max_num(15,10)
print(result)
Python 面向對象
場景案例:
在XX班級要求兩名新同學Jack和Harry分別介紹自己的名字和來自哪座城市,然後分別說一句班級口號:“Hello,” 最終控制臺打印效果如下:
My
nameis
Jack
andcome
fromBeijing
Hello
My
nameis
Harry
andcome
fromShanghai
Hello
僅結合前面所學基礎知識來實現:
name=
‘Jack‘
city=
‘Beijing‘
print("My name is %s and come from %s" %(name,city))
print("Hello")
name=
‘Harry‘
city=
‘Shanghai‘
print("My name is %s and come from %s" %(name,city))
print("Hello ")
?思考幾個問題?
1, 如果老師要求全班50個同學依次以上面形式自我介紹,該怎麽辦?
2, 每個同學介紹自己姓名和來自城市之後,再順便介紹自己的年齡?
3, 每個同學自我介紹的代碼塊有何相同特征?
類與對象
現實世界中,隨處可見的一種事物就是對象,對象是事物存在的實體,如人類、汽車、動物、水果這些都是一個抽象的類別,我們所見到的實物都是這些類的具體存在,因此類是對象的抽象集合,對象是類的具體表現。現實世界是萬物皆對象!
人
- 屬性:地域、膚色、國家.....
- 功能:走路、思考、飲食、繁衍、....
- 具體對象:中國人,非洲人
學生
- 屬性:姓名,學號、城市、年齡....
- 功能:聽,說、讀、寫...
- 具體對象:Jack同學,Harry同學
面向對象關鍵要素
類(Class):
用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。
數據成員:
類的不同屬性數據。
對象:
對象是類的實例
方法:
類中定義的函數,實現相關的功能。
面向對象編程
簡稱OOP(Object Oriented Programming),是一種程序設計思想。OOP把對象作為程序的基本單元,一個對象包含了數據和操作數據的函數(方法)。
面向對象的設計思想是從自然界中來的,因為在自然界中,類(Class)和實例(Instance)的概念是很自然的。Class是一種抽象概念,比如我們定義的 Student類,是指學生這個概念,而實例(Instance)則是一個個體的Student對象。
Python是一門面向對象的語言,在Python中創建一個類和對象是很容易的。
三大特性
- 封裝
- 繼承
- 多態
Python 類與對象
定義類
class Student(object):
類體
Class是類的定義的關鍵詞,class後面緊接著是類名,即Student,類名通常是大寫開頭的單詞,緊接著是(object),表示該類是從哪個類繼承下來的。通常如果沒有明確的繼承類,就使用object類,括號內一般為空默認就是繼承Obejct類。這是所有類最終都會繼承的類,也就是基類。
屬性初始化
由於類可以起到模板的作用,因此,可以在創建實例對象的時候,把一些我們認為必須綁定的屬性強制填寫進去。通過定義一個特殊的__init__方法,如:在創建Student實例的時候,就把name,city等屬性綁上去:
class Student():
def __init__(self,name,city):
self.name=name
self.city=city
print(
"My name is %s and come from %s"% (name, city))
__init__方法的第一個參數永遠是self,表示創建的實例本身,因此,在__init__方法內部,就可以把各種屬性綁定到self,因為self就指向創建的實例本身。有了__init__方法,在創建實例的時候,就不能傳入空的參數了,必須傳入與__init__方法匹配的參數,但self不需要傳,Python解釋器自己會把實例變量傳進去。
定義方法
類的方法除了第一個參數是self外,其他和普通函數一樣。要調用一個方法,只需要在實例變量上直接調用,
class Student():
def __init__(self,name,city):
self.name=name
self.city=city
print(
"My name is %s and come from %s"% (name, city))
def talk(self):
print(
"Hello,51zxw")
生成實例對象
stu1=
Student(‘Jack‘,‘Beijing‘)
stu1.
talk()
stu2=
Student(‘Harry‘,‘Shanghai‘)
stu2.
talk()
模 塊
為何要使用模塊?
隨著項目功能和需求增多,代碼量也會增大,把全部代碼放在一個文件會顯得冗余,因此需要使用模塊進行分區管理。
Python模塊是什麽?
Python 模塊(Module),是一個 Python 文件,以 .py 結尾,包含了 Python 對象定義和Python語句。
使用模塊有什麽好處?
最大的好處是大大提高了代碼的可維護性。其次,編寫代碼不必從零開始。當一個模塊編寫完畢,就可以被其他地方引用。如:隨機數模塊,時間模塊。
import語句
導入時間模塊顯示當前系統時間
#模塊顯示當前時間
import
time
(
time.ctime())
#調用獲取當前時間的方法
導入隨機數模塊顯示隨機整數
import random
num=random.
randint()
print(num)
from ...import ....
Python 的 from 語句讓你從模塊中導入一個指定的部分到當前命名空間中。
from
timeimport sleep
from Student import Student
stu1=Student(‘jack‘,‘Beijing‘)
stu1.talk()
stu2=Student(‘Harry‘,‘Shanghai‘)
stu2.talk()
跨目錄調用模塊
案例:調用School目錄下的Student模塊
from School.Student import Student
stu1=Student(‘jack‘,‘Beijing‘)
stu1.talk()
stu2=Student(‘Harry‘,‘Shanghai‘)
stu2.talk()
import 搜索路徑
當你導入一個模塊,Python 解析器對模塊位置的搜索順序是:
- 1、當前目錄
- 2、如果不在當前目錄,Python 則搜索 PYTHONPATH 下的每個目錄。
- 3、如果都找不到,Python會察看安裝默認路徑。
Python異常
什麽是異常?
異常即是一個事件,該事件會在程序執行過程中發生,影響了程序的正常執行。 一般情況下,在Python無法正常處理程序時就會發生一個異常。 異常是Python對象,表示一個錯誤。 當Python腳本發生異常時我們需要捕獲處理它,否則程序會終止執行。
常見異常類型
異常名稱 |
描述 |
FileNotFoundError |
找不到指定文件的異常 |
NameError |
未聲明/初始化對象 (沒有屬性) |
BaseException |
所有異常的基類 |
異常處理語句
- try...except...
- try...except...finally
- raise
1.try....except
FileNotFoundError
try:
fileName=
input("Please input fileName:")
open("%s.txt" %fileName)
except FileNotFoundError:
print("%s file not found " %fileName)
NameError
try:
print(stu)
except NameError:
print("stu not define !")
BaseException
try:
print(stu)
except BaseException:
print("stu not define !")
try…except…as…
try:
#stu=
‘Jack‘
print(stu)
except BaseException as msg:
print(msg)
try... except... else 使用
try:
stu=
‘Jack‘
print(stu)
except BaseException as msg:
print(msg)
else:
print("stu is defined!")
try..except...finally 輸出
try:
#stu=
‘Jack‘
print(stu)
except BaseException as msg:
print(msg)
finally:
print("The end !")
raise 拋出異常
前面try語句是執行過程中捕獲代碼塊的異常,而raise是通過事先定義一個條件,一旦符合異常條件就拋出異常。
def division(x,y):
if
y==
0:
raise
ZeroDivisionError(
"Zero is not allow!")
return
x/y
try:
division(
8,
0)
exceptBaseException
asmsg:
print(msg)
註意:raise只能用於Python標準異常類!
異常名稱 |
描述 |
BaseException |
所有異常的基類 |
SystemExit |
解釋器請求退出 |
KeyboardInterrupt |
用戶中斷執行(通常是輸入^C) |
Exception |
常規錯誤的基類 |
StopIteration |
叠代器沒有更多的值 |
GeneratorExit |
生成器(generator)發生異常來通知退出 |
StandardError |
所有的內建標準異常的基類 |
ArithmeticError |
所有數值計算錯誤的基類 |
FloatingPointError |
浮點計算錯誤 |
OverflowError |
數值運算超出最大限制 |
ZeroDivisionError |
除(或取模)零 (所有數據類型) |
AssertionError |
斷言語句失敗 |
AttributeError |
對象沒有這個屬性 |
EOFError |
沒有內建輸入,到達EOF 標記 |
EnvironmentError |
操作系統錯誤的基類 |
IOError |
輸入/輸出操作失敗 |
OSError |
操作系統錯誤 |
WindowsError |
系統調用失敗 |
ImportError |
導入模塊/對象失敗 |
LookupError |
無效數據查詢的基類 |
IndexError |
序列中沒有此索引(index) |
KeyError |
映射中沒有這個鍵 |
MemoryError |
內存溢出錯誤(對於Python 解釋器不是致命的) |
NameError |
未聲明/初始化對象 (沒有屬性) |
UnboundLocalError |
訪問未初始化的本地變量 |
ReferenceError |
弱引用(Weak reference)試圖訪問已經垃圾回收了的對象 |
RuntimeError |
一般的運行時錯誤 |
NotImplementedError |
尚未實現的方法 |
SyntaxError |
Python 語法錯誤 |
IndentationError |
縮進錯誤 |
TabError |
Tab 和空格混用 |
SystemError |
一般的解釋器系統錯誤 |
TypeError |
對類型無效的操作 |
ValueError |
傳入無效的參數 |
UnicodeError |
Unicode 相關的錯誤 |
UnicodeDecodeError |
Unicode 解碼時的錯誤 |
UnicodeEncodeError |
Unicode 編碼時錯誤 |
UnicodeTranslateError |
Unicode 轉換時錯誤 |
Warning |
警告的基類 |
DeprecationWarning |
關於被棄用的特征的警告 |
FutureWarning |
關於構造將來語義會有改變的警告 |
OverflowWarning |
舊的關於自動提升為長整型(long)的警告 |
PendingDeprecationWarning |
關於特性將會被廢棄的警告 |
RuntimeWarning |
可疑的運行時行為(runtime behavior)的警告 |
SyntaxWarning |
可疑的語法的警告 |
UserWarning |
用戶代碼生成的警告 |
文件處理
打開文件
使用Python內置的方法 open()可以打開文件
file object = open(file_name [, access_mode][, buffering])
- file_name:file_name變量是一個包含了你要訪問的文件名稱的字符串值。
- access_mode:access_mode決定了打開文件的模式:只讀,寫入,追加等。所有可取值見如下的完全列表。這個參數是非強制的,默認文件訪問模式為只讀(r)。
- buffering:如果buffering的值被設為0,就不會有寄存。如果buffering的值取1,訪問文件時會寄存行。如果將buffering的值設為大於1的整數,表明了這就是的寄存區的緩沖大小。如果取負值,寄存區的緩沖大小則為系統默認。
f=
open(‘stu_info.txt‘,‘r‘)
f=
open(‘E:\\test\\stu_info.txt‘,‘r‘)
常用文件打開模式
模式 |
描述 |
r |
以只讀方式打開文件。 |
rb |
以二進制格式打開一個文件用於只讀。 |
w |
打開一個文件只用於寫入。 |
a |
打開一個文件用於追加。新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 |
文件讀取
line=f.
read()
line1=f.
readline()
line2=f.
readlines()
- read() 每次讀取整個文件,它通常用於將文件內容放到一個字符串變量中。
- readline() 每次只讀取一行
- readlines()一次性讀取文件所有行 自動將文件內容分析成一個行的列表,該列表可以由 Python 的 for ... in ... 結構進行處理。
關閉文件
f.close()
讀取txt文件
案例:讀取stu_info.txt文件內容,並將所有文件中學生名稱顯示出來
f=
open(‘stu_info.txt‘,‘r‘)
lines=f.
readlines()
print(lines)
forline
inlines:
print(line.split(‘,‘)
[
0])
split()方法語法:
str.split(
str=
"", num=string.
count(
str)).
參數
- str -- 分隔符,默認為所有的空字符,包括空格、換行(\n)、制表符(\t)等。
- num -- 分割次數
讀寫csv文件
csv即為逗號分隔值(Comma-Separated Values,CSV),有時也稱為字符分隔值,因為分隔字符也可以不是逗號),其文件以純文本形式存儲表格數據(數字和文本)。
csv文件讀取
案例:讀取Stu_info.csv文件裏所有學生信息。
import csv
csv_file=csv.
reader(open(‘Stu_info.csv‘,‘r‘))
forstu
incsv_file:
print(stu)
csv文件寫入
對Stu_info.csv文件追加寫入兩個學生信息
stu=[
‘Marry‘,
28,
‘Changsha‘]
stu1=[
‘Rom‘,
23,
‘Chengdu‘]
out=
open(‘Stu_info.csv‘,‘a‘,newline=‘‘)
csv_write=csv.
writer(out,dialect=‘excel‘)
csv_write.
writerow(stu)
csv_write.
writerow(stu1)
print("Write File Over!")
xml文件處理
什麽是xml文件?
xml即可擴展標記語言,它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。
從結構上,很像HTML超文本標記語言。但他們被設計的目的是不同的,具體如下:
- XML 被設計用來傳輸和存儲數據。
- HTML 被設計用來顯示數據。
<?xml version="1.0" encoding="utf-8"?>
<note>
<to id=‘001‘>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don‘t forget the meeting!</body>
</note>
xml特征:
- 它是有標簽對組成,<aa></aa>
- 標簽可以有屬性:<aa id=‘123‘></aa>
- 標簽對可以嵌入數據:<aa>abc</aa>
- 標簽可以嵌入子標簽(具有層級關系)
XMl文件結構
- XML 文檔形成了一種樹結構,它從“根部”開始,然後擴展到“枝葉”。
- 第一行是 XML 聲明。它定義 XML 的版本 (1.0) 和所使用的編碼
- <note>是根元素,也稱為根節點。
- <to><from><heading><body>是子元素(子節點)
- XML 文檔必須包含根元素。該元素是所有其他元素的父元素
DOM文檔對象模型
文檔對象模型(Document Object Model,簡稱DOM),DOM 就是針對 HTML 和 XML 提供的一個API。什麽意思?就是說為了能以編程的方法操作這個 HTML 的內容(比如添加某些元素、修改元素的內容、刪除某些元素),我們把這個 HTML或xml 看做一個對象樹(DOM樹),它本身和裏面的所有東西比如 <div></div> 這些標簽都看做一個對象,每個對象都叫做一個節點(node)。
DOM 有什麽用?
就是為了操作 HTML或xml 中的元素,比如說我們要通過 JS 把這個網頁的標題改了,直接這樣就可以了:
document.title = ‘51zxw‘;
創建xml文件
創建一個xml文件Class_info.xml 用來存儲班級學生(姓名,年齡,城市),老師(姓名,年齡,城市)、教務賬號(學生和老師的賬號,密碼)等信息。
<?xml version="1.0" encoding="UTF-8" ?>
<Class>
<student>
<name >Jack</name>
<age>28</age>
<city>Beijing</city>
</student>
<student>
<name >Bob</name>
<age>25</age>
<city>Shanghai</city>
</student>
<student>
<name>Harry</name>
<age>23</age>
<city>ShenZhen</city>
</student>
<teacher>
<name>Marry</name>
<age>23</age>
<city>Changsha</city>
</teacher>
<account>
<login username="student" password="123456"/>
<login username="teacher" password="888888"/>
</account>
</Class>
xml節點
xml文件節點一般包含3類:
- 元素節點
- 文本節點
- 屬性節點
每個節點都擁有包含著關於節點某些信息的屬性。這些屬性是:
- nodeName(節點名稱)
- nodeValue(節點值)
- nodeType(節點類型)
讀取元素節點
案例:查看Class_info.xml文件裏Class節點的屬性(結點名稱,節點的值、節點類型)
from xml
.domimport minidom
#
加載
xml
文件
dom=minidom.
parse(‘Class_info.xml‘)
#
加載
dom
對象元素
root=dom
.documentElement
#
打印節點信息
print(root.nodeName)
print(root.nodeValue)
print(root.nodeType)
- nodeName 節點名稱
- nodeValue 返回文本節點的值
- nodeType 屬性返回以數字值返回指定節點的節點類型。
- 如果節點是元素節點,則 nodeType 屬性將返回 1。
- 如果節點是屬性節點,則 nodeType 屬性將返回 2。
讀取文本節點的值
案例:分別打印出Class_info.xml裏的學生和老師的詳細信息(姓名,年齡、城市)
from xml
.domimport minidom
#
獲取標簽對的值
#
打開文件
dom=minidom.
parse(‘Class_info.xml‘)
#
獲取文檔對象元素
root=dom
.documentElement
#
根據標簽名稱獲取標簽對象
names=root.
getElementsByTagName(‘name‘)
ages=root.
getElementsByTagName(‘age‘)
citys=root.
getElementsByTagName(‘city‘)
#
分別打印顯示
xml
文檔標簽對裏面的內容
fori
in
range(4)
:
print(names[i].firstChild.data)
print(ages[i].firstChild.data)
print(citys[i].firstChild.data)
讀取屬性節點的值
案例:分別讀取打印老師和學生的賬號密碼。
from xml
.domimport minidom
dom=minidom.
parse(‘Class_info.xml‘)
root=dom
.documentElement
logins=root.
getElementsByTagName(‘login‘)
#
獲取
login
標簽的
username
屬性
fori
in
range(2)
:
username=logins[i].
getAttribute(‘username‘)
print(username)
password=logins[i].
getAttribute(‘password‘)
print(password)
讀取子節點信息
讀取子節點<student>相關屬性
- nodeName(節點名稱)
- nodeValue(節點值)
- nodeType(節點類型)
from xml
.domimport minidom
#
加載
xml
文件
dom=minidom.
parse(‘Class_info.xml‘)
root=dom
.documentElement
tags=root.
getElementsByTagName(‘student‘)
print(tags[0].nodeName)
print(tags[0].tagName)
print(tags[0].nodeType)
print(tags[0].nodeValue)
多線程與多進程
進程(Process)
是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。
線程(Thread)
有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。 線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,一個進程可以包含多個線程,但是線程不能包含多個進程。線程自己不擁有系統資源 ,在單個程序中同時運行多個線程完成不同的工作,稱為多線程。
線程與進程的區別
線程和進程的區別在於,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文。
Tips:
LoadRunner和Jmeter性能測試工具也利用了多線程和多進程來構造多個並發用戶來執行性能測試。
線程與進程圖文解釋
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
單線程
單線程在程序執行時,所走的程序路徑按照連續順序排下來,前面的必須處理好,後面的才會執行。
案例:一個學生先用2秒說話,接著用3秒寫字,最後結束。
fromtime
importctime,sleep
def talk():
print(
"Start talk %r"%ctime())
sleep(
2)
def write():
print(
"Start Write! %r"%ctime())
sleep(
3)
if__name__==
"__main__":
talk()
write()
print(
"All end %r"%ctime())
if __name__=="__main__": 表示如果當前模塊是被直接運行的,則該語句之後代碼塊被運行,如果模塊是被導入的,則代碼塊不被運行。
多線程
多線程(MultiThreading)是指從軟件或者硬件上實現多個線程並發執行的技術。
案例:讓學生同時進行說和寫操作
from
timeimport ctime,sleep
import threading
def
talk(content,loop):
for
i
in
range(loop)
:
print("Start Talk %s %s" %(content,ctime()
))
sleep(3)
def
write(content,loop):
for
i
in
range(loop)
:
print("Start Write %s %s" %(content,ctime()
))
sleep(5)
threads=[]
t1=threading.
Thread(target=talk,args=(‘Speak: Hello,51zxw‘,2))
threads.
append(t1)
t2=threading.
Thread(target=write,args=(‘Write: Life is Short You need Python!‘,2))
threads.
append(t2)
if__name__==
‘__main__‘:
for
t
inthreads:
t.
start()
for
t
inthreads:
t.
join()
print("All the End %r" %ctime()
)
多進程
與多線程相比,多進程就是import multiprocessing 然後替換相應的方法multiprocessing.Process()
from
timeimport sleep,ctime
import multiprocessing
def
talk(content,loop):
for
i
in
range(loop)
:
print("Talk: %s %s" %(content,ctime()
))
sleep(2)
def
write(content,loop):
for
i
in
range(loop)
:
print("Write: %s %s"%(content,ctime()
))
sleep(3)
process=[]
p1=multiprocessing.
Process(target=talk,args=(‘hello 51zxw‘,2))
process.
append(p1)
p2=multiprocessing.
Process(target=write,args=(‘Python‘,2))
process.
append(p2)
if__name__==
‘__main__‘:
for
p
in
process:
p
.
start()
for
p
in
process:
p
.
join()
print("All process is Run %s" %ctime()
)
相關延伸:
- 進程間通信IPC(Interprocess communication)
- 線程鎖,進程鎖
- 生命周期
- 進程調度
Python 爬蟲——爬取Web頁面圖片
從網頁頁面上批量下載jpg格式圖片,並按照數字遞增命名保存到指定的文件夾。
Web地址:http://p.weather.com.cn/2017/06/2720826.shtml#p=1
import urllib
import urllib.request
import re #正則表達式
#解析頁面
def load_page(url):
request=urllib.request.Request(url) #發送網絡請求
response=urllib.request.urlopen(request)#根據url打開頁面
data=response.read() #獲取頁面響應數據
return data
#下載圖片
def get_image(html):
regx=r‘http://[\S]*jpg‘ #定義正則表達式,匹配頁面圖片元素
pattern=re.compile(regx) #編譯表達式構造匹配模式
get_image=re.findall(pattern,repr(html)) #進行正則匹配並返回結果
num = 1
#遍歷獲取的圖片
for img in get_image:
image=load_page(img)
#將圖片存入到指定文件夾
with open(‘E:\\Photo\\%s.jpg‘ %num,‘wb‘) as fb:
fb.write(image)
print("正在下載第 %s張圖片" %num)
num = num + 1
print("下載完成!")
url=‘http://p.weather.com.cn/2017/06/2720826.shtml#p=1‘
html=load_page(url)
get_image(html)
正則表達式相關知識:
https://deerchao.net/tutorials/regex/regex.htm
Python猜數小遊戲