以下為學python以來知識點及練習記錄,用于個人知識點復習
DAY01-02 介紹、變量、格式化輸出
1.python是編譯型語言還是解釋性語言,兩種類型的語言的程序有什么不同?
答:解釋型。
py文件”編譯“完的結果是字節碼,cpu還是執行不了,依然借助Python虛擬機解釋執行。
但放寬了說,將高級語言轉換為比它低級的語言再去解釋執行(比如將源碼翻譯為字節碼),也可以稱之為編譯過程的話,那么Python就不僅僅是解釋型的語言
2.python相對與其他語言有什么優點和缺點?
優點:簡單、易學、免費、開源、可移植性、解釋性、面向對象、可拓展性、豐富的庫、規范的代碼
缺點:運行速度、國內市場小、中文資料匱乏、架構多
3.Python應用場景有哪些
web后端開發、網絡爬蟲與數據分析、人工智能等
4.注釋:提高代碼可讀性
分為單行注釋#? ? ? ? ? ? ? ? 快捷鍵:? ? ctr+/
多行注釋"""? """
5.變量:可用來存儲數據,如字符串、數字等,可復用
每一個變量都存儲這一種類型的數據,該數據的類型就是該變量的類型
6.標示符可以理解成是一套命名規則
常見的標示符的命名規則: 大駝峰命名法、小駝峰命名法,下劃線連接命名法
7.格式化是指將數據按照預先定義好的格式處理數據的結構
格式化輸出可以讓開發者很方便的處理數據的,組裝數據,然后將其輸出
8.python交互模式:終端輸入python
linux上通過vi、sublime、gedit等編輯器實現,文件后綴,py
9.注釋單行#
多行
"""
注釋內容? ? ? ?
"""
10.變量的命名規則
? ? ? 1.只能由下劃線、數字和字母組成
? ? ? 2.不能以數字開頭
? ? ? 3.不能與關鍵字同名
? ? ? 4.應盡量避免與引用到的函數或庫同名
注意,通過以下命令可以查看?Python?中的關鍵字
import keyword
print(keyword.kwlist)
# 判斷是不是關鍵字
print(keyword.iskeyword('None'))
out(1): True
11.python的數據類型:
數字型: 整型 (int)
? ? ? ? ? ? 浮點型(float)
? ? ? ? ? ? 布爾型(bool)
真?True?數學運算時表示 1
假?False?數學運算時表示 0
? ? ? ? ? ? 復數型 (complex),基本不用
非數字型:
? ? ? ? ? ? 字符串
? ? ? ? ? ? 列表
? ? ? ? ? ? 元組
? ? ? ? ? ? 字典
12.進入python3交互模式,定義任意個變量,使用并查看其類型
>>> name="杜錦航"
>>> type(name)
<class 'str'>
>>>
13.大駝峰:
MyName="杜錦航"
小駝峰:
myName="杜錦航"
14.int(x) ? ? ? ? 將x轉換為一個整數 ? ?
long(x ) ? ? ? ?將x轉換為一個長整數 ? ?
float(x ) ? ? ? ? ? ? ? 將x轉換到一個浮點數 ? ?
complex(real [,imag ]) ?創建一個復數 ? ?
str(x ) ? ? ? ? ? ? ? ? 將對象 x 轉換為字符串 ? ?
repr(x ) ? ? ? ? ? ? ? ?將對象 x 轉換為表達式字符串 ? ?
eval(str ) ? ? ? ? ? ? ?用來計算在字符串中的有效Python表達式,并返回一個對象 ? ?
tuple(s ) ? ? ? ? ? ? ? 將序列 s 轉換為一個元組 ? ?
list(s ) ? ? ? ? ? ? ? ?將序列 s 轉換為一個列表 ? ?
chr(x ) ? ? ? ? ? ? ? ? 將一個整數轉換為一個字符 ? ?
unichr(x ) ? ? ? ? ? ? ?將一個整數轉換為Unicode字符 ? ?
ord(x ) ? ? ? ? ? ? ? ? 將一個字符轉換為它的整數值 ? ?
hex(x ) ? ? ? ? ? ? ? ? 將一個整數轉換為一個十六進制字符串 ? ?
oct(x ) ? ? ? ? ? ? ? ? 將一個整數轉換為一個八進制字符串 ??
15. 取商://
取余:%
16.>>> print(name)
杜錦航
>>> age=18
>>> height=173.00
>>> print("name is %s,age is %d,height is %.2f"%(name,age.height)
... )
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'height'
>>> print("name is %s,age is %d,height is %.02f"%(name,age.height)
... print("name is %s,age is %d,height is %.02f"%(name,age.height))
? File "<stdin>", line 2
? ? print("name is %s,age is %d,height is %.02f"%(name,age.height))
? ? ? ? ^
SyntaxError: invalid syntax
>>> print("name is %s,age is %d,height is %.02f"%(name,age.height))
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'height'
>>> print(height)
173.0
>>> print("name is %s,age is %d,height is %2f"%(name,age.height))
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'height'
>>> print("name is %s,age is %d,height is %f"%(name,age.height))
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'height'
>>> print("name is %s,age is %d,height is %f"%(name,age,height))
name is 杜錦航,age is 18,height is 173.000000
>>>
打錯符號,,,,,,,查了半天
17.
"""
編寫一個cart.py(打印名片)程序
運行程序后,分別輸入姓名、性別、年齡、單位、聯系方式等數據,并用變量分別接收
輸入完成后,最后打印出姓名、性別、年齡、單位、聯系方式等信息,輸出的格式自行設定,盡量美觀
輸出需使用上格式化輸出
"""
name = input('請輸入姓名')
company = input('請輸入公司')
title = input('請輸入職位')
phone = input('請輸入電話')
email = input('請輸入郵箱')
print(company)
print("*" * 30)
print("姓名:%s" % name)
print("職位:%s" % title)
print("聯系電話:%s" % phone)
print("郵箱:%s" % email)
print("*" * 30)
結果:
F:\python\python.exe F:/pycharm/project/day01/cart.py
請輸入姓名杜錦航
請輸入公司宇通
請輸入職位液壓工程師
請輸入電話15734039106
請輸入郵箱15734039106@163.com
宇通
******************************
姓名:杜錦航
職位:液壓工程師
聯系電話:15734039106
郵箱:15734039106@163.com
******************************
DAY03 條件語句
1.# 練習: 定義一個整數變量 age,編寫代碼判斷年齡是否正確,要求人的年齡在 0-120 之間
age = 19
if age >= 0 and age <= 120:
? ? print("1")
else:
? ? print("2")
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!注意符號和字母必須英文格式輸入!!!!!!!!!!!!!!!!!!!!!!!!!
2.random()函數
import random
import string
# 隨機整數:
print random.randint(1,50)
# 隨機選取0到100間的偶數:
print random.randrange(0, 101, 2)
# 隨機浮點數:
print random.random()
print random.uniform(1, 10)
# 隨機字符:
print random.choice('abcdefghijklmnopqrstuvwxyz!@#$%^&*()')
# 多個字符中生成指定數量的隨機字符:
print random.sample('zyxwvutsrqponmlkjihgfedcba',5)
# 從a-zA-Z0-9生成指定數量的隨機字符:
ran_str = ''.join(random.sample(string.ascii_letters + string.digits, 8))
print ran_str
# 多個字符中選取指定數量的字符組成新字符串:
print ''.join(random.sample(['z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'], 5))
# 隨機選取字符串:
print random.choice(['剪刀', '石頭', '布'])
# 打亂排序
items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print random.shuffle(items)
注意:輸出需要print,試了好幾次,忘了print,還納悶怎么不出來隨機數
DAY04 循環語句
1.
#!/usr/bin/python
# 定義一個行變量
row = 1
while row <= 5:
? ? print("*"*row)
? ? row += 1
2.在默認情況下,print?函數輸出內容之后,會自動在內容末尾增加換行
如果不希望末尾增加換行,可以在?print?函數輸出內容的后面增加?, end=""
其中?""?中間可以指定?print?函數輸出內容之后,繼續希望顯示的內容
語法格式如下:
# 向控制臺輸出內容結束之后,不會換行
print("*", end="")
# 單純的換行
print("")
故,序號1也可:
#!/usr/bin/python
# 在控制臺連續輸出五行 *,每一行星號的數量依次遞增
row = 1
while row <= 5:
? ? rol = 1
? ? while rol <= row:
? ? ? ? print("*",end="")
? ? ? ? rol += 1
? ? print("")
? ? row += 1
結果為:
F:\python\python.exe F:/pycharm/project/day01/XingXing.py
*
**
***
****
*****
3.九九乘法表
轉義字符 描述
\ 反斜杠符號
\' 單引號
\" 雙引號
\n 換行
\t 橫向制表符
\r 回車
#!/usr/bin/python
# 在控制臺連續輸出五行 *,每一行星號的數量依次遞增,把*換成行列相乘
row = 1
while row <= 9:
? ? rol = 1
? ? while rol <= row:
? ? ? ? print(("%d*%d=%d")%(rol,row,row*rol),end="\t")? ? ? ?#不換行? ? ? ? ?\t 對齊
? ? print("")? ? ? ? #手動換行
? ? row += 1
結果:
F:\python\python.exe F:/pycharm/project/day01/XingXing.py
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
Process finished with exit code 0
4.運算符
運算符 描述 ? ? ? ? ? ? ? ? 實例
= 簡單的賦值運算符 ? ? c = a + b 將 a + b 的運算結果賦值為 c
+= 加法賦值運算符 ? ? c += a 等效于 c = c + a
-= 減法賦值運算符 ? ? c -= a 等效于 c = c - a
*= 乘法賦值運算符 ? ? c *= a 等效于 c = c* a
/= 除法賦值運算符 ? ? c /= a 等效于 c = c / a
//= 取整除賦值運算符 ? ? c //= a 等效于 c = c // a
%= 取 模 (余數)賦值運算符 c %= a 等效于 c = c % a
**= 冪賦值運算符 ? ? ? ? ? ? c **= a 等效于 c = c** a
運算符優先級
運算符 ? ? ? ? ? ? ? ? ? ? ? ? 描述
** ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 冪 (最高優先級)
* / % // ? ? ? ? ? ? ? ? ? ? ? ? 乘、除、取余數、取整除
+ - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 加法、減法
<= < > >= ? ? ? ? ? ? ? ? ? ? ? ? 比較運算符
== != ? ? ? ? ? ? ? ? ? ? ? ? 等于運算符
= %= /= //= -= += = *= 賦值運算符
not or and ? ? ? ? ? ? ? ? 邏輯運算符
DAY05 列表、元祖
1.
列表用?[]?定義,數據?之間使用?,?分隔
例:a=[2,4,5]
b=['data','frog','python']
for 實現列表的遍歷
例如:
for name in name_list:
? ? 循環內部針對列表元素進行操作
? ? print(name)
2.
測量列表中元素的個數? len()
獲取列表的某個元素? ? ?
列表[索引] 向列表中添加元素? ? ? ?append() 、 extend() 、 insert()
如何刪除列表中的某個元素??del pop() remove()
如何修改列表中的某個元素? 直接根據索引來修改?列表[要修改的元素的索引] = 值
如何去查找列表中某個元素所對應的下標? 列表.index(元素)
升序排列:列表名.sort()
降序排列:列表名.sort(reverse=True)
3.
元組用?()?定義
例如:
a=(2,4,5)
b=('data','frog','python')
查詢:
元組[索引] ? ? ? ? 根據索引取值,索引不存在會報錯
元組.index(數據) 根據值查詢索引,返回首次出現時的索引,沒有查到會報錯
元組.count(數據) 數據在元組中出現的次數
len(列表) ? ? ? ? ? ? ? ? 元組長度
if 數據 in 元組: ? ? ? ? 檢查元組中是否包含某元素
4.
使用?list?函數可以把元組轉換成列表? ? ? ? ? list(元組)
使用?tuple?函數可以把列表轉換成元組? ? ? tuple(列表)
5.
# 編寫代碼設計簡易計算器,可以進行基本的加減乘除運算。
num1 = int(input("請輸入第一個數字:"))
symbol = input("請輸入運算符")
num2 = int(input("請輸入第二個數字:"))
if symbol == "+":
? ? print("%d+%d=%d"%(num1,num2,num1*num2))
elif symbol == "-":
? ? print("%d-%d=%d"%(num1,num2,num1-num2))
elif symbol == "*":
? ? print("%d*%d=%d"%(num1,num2,num1*num2))
elif symbol == "/":
? ? print("%d/%d=%d"%(num1,num2,num1/num2))
else:
? ? print("請輸入正確的運算符")
結果:
F:\python\python.exe F:/pycharm/project/day05/高級變量.py
請輸入第一個數字:10
請輸入運算符/
請輸入第二個數字:5
10/5=2
Process finished with exit code 0
6.
# 使用while循環輸出*
row = 1
while row <= 5:
? ? print("*"*row)
? ? row += 1
結果:
F:\python\python.exe F:/pycharm/project/day05/xingxing.py
*
**
***
****
*****
DAY06 字典
1.字典用?{key:value,...}?定義
例如:xiaoming = {"name": "小明",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "age": 18,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "gender": True,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "height": 1.75}
常用操作:
序號分類關鍵字 / 函數 / 方法說明
? ? ?1增加字典[鍵] = 數據鍵不存在,會添加鍵值對;鍵存在,會修改鍵值對的值
? ? ?2刪除del 字典[鍵]刪除指定的鍵值對
? ? ?字典.pop(鍵)刪除指定鍵值對,返回被刪除的值
? ? ?字典.clear清空字典
? ? ?3修改字典[鍵] = 數據鍵不存在,會添加鍵值對;鍵存在,會修改鍵值對的值
? ? ?字典.setdefault(鍵,數據)鍵值對不存在,添加鍵值對;存在則不做處理
? ? ?字典.update(字典2)取出字典2的鍵值對,鍵值對不存在,添加鍵值對;存在則修改值
? ? ?4查詢字典[鍵]根據鍵取值,鍵值對不存在會報錯
? ? ?字典.get(鍵)根據鍵取值,鍵值對不存在不會報錯
? ? ?字典.keys()可進行遍歷,獲取所有鍵
? ? ?字典.values()可進行遍歷,獲取所有值
? ? ?字典.items()可進行遍歷,獲取所有(鍵,值)
2.字典應用場景
使用?多個鍵值對,存儲?描述一個 物體 的相關信息?—— 描述更復雜的數據信息
將?多個字典?放在?一個列表?中,再進行遍歷,在循環體內部針對每一個字典進行?相同的處理
字典的遍歷:字典.keys()、字典.values()、字典.items()
3.字符串
注意:如果字符串內部需要使用?",可以使用?'?定義字符串
? ? ? ? ? 如果字符串內部需要使用?',可以使用?"?定義字符串
? ? ? ? ? 可以使用 索引 獲取一個字符串中 指定位置的字符,索引計數從 0 開始
? ? ? ? ? 也可以使用 for 循環遍歷 字符串中每一個字符
例:
string = "Hello Python"
for c in string:
? ? print(c, end="")
結果:
Hello Python
常用操作;
判斷
方法說明
string.isalpha()如果 string 至少有一個字符并且所有字符都是字母則返回 True
string.isdecimal()如果 string 只包含數字則返回 True
string.islower()如果 string 中包含至少一個區分大小寫的字符,并且所有這些(區分大小寫的)字符都是小寫,則返回 True
string.isupper()如果 string 中包含至少一個區分大小寫的字符,并且所有這些(區分大小寫的)字符都是大寫,則返回 True
string.startswith(str)檢查字符串是否是以 str 開頭,是則返回 True
string.endswith(str)檢查字符串是否是以 str 結束,是則返回 True
查找和替換
方法說明
string.find(str, start=0, end=len(string))檢測 str 是否包含在 string 中,如果 start 和 end 指定范圍,則檢查是否包含在指定范圍內,如果是返回開始的索引值,否則返回?-1
string.rfind(str, start=0, end=len(string))類似于 find(),不過是從右邊開始查找
string.index(str, start=0, end=len(string))跟 find() 方法類似,不過如果 str 不在 string 會報錯
string.rindex(str, start=0, end=len(string))類似于 index(),不過是從右邊開始
string.replace(old_str, new_str, num=string.count(old))返回一個新字符串,把 string 中的 old_str 替換成 new_str,如果 num 指定,則替換不超過 num 次
拆分和連接
方法說明
string.partition(str)返回元組,把字符串 string 分成一個 3 元素的元組 (str前面, str, str后面)
string.rpartition(str)類似于 partition() 方法,不過是從右邊開始查找
string.split(str="", num)返回列表,以 str 為分隔符拆分 string,如果 num 有指定值,則僅分隔 num + 1 個子字符串,str 默認包含 '\r', '\t', '\n' 和空格
string.splitlines()返回列表,按照行('\r', '\n', '\r\n')分隔
string1 + string2拼接兩個字符串
string.join(seq)返回字符串,以 string 作為分隔符,將 seq 中所有的元素(的字符串表示)合并為一個新的字符串
大小寫轉換
方法說明
string.lower()返回新字符串,轉換 string 中所有大寫字符為小寫
string.upper()返回新字符串,轉換 string 中的小寫字母為大寫
文本對齊
方法說明
string.ljust(width)返回新字符串,基于原字符串左對齊,并使用空格填充至長度 width
string.rjust(width)返回新字符串,基于原字符串右對齊,并使用空格填充至長度 width
string.center(width)返回新字符串,基于原字符串居中,并使用空格填充至長度 width
去除空白字符
方法說明
string.lstrip()返回新字符串,截掉 string 左邊(開始)的空白字符
string.rstrip()返回新字符串,截掉 string 右邊(末尾)的空白字符
string.strip()返回新字符串,截掉 string 左右兩邊的空白字符
4.切片
切片方法適用于字符串、列表、元組
字符串[開始索引:結束索引:步長]
注意:指定的區間屬于左閉右開型 [開始索引, 結束索引) 對應
開始索引 <= 范圍 < 結束索引
從頭開始,開始索引 數字可以省略,冒號不能省略
到末尾結束,結束索引 數字和冒號都可以省略
步長默認為 1,如果元素連續,數字和冒號都可以省略
例如:
截取從 2 ~ 5 位置 的字符串
截取從 2 ~ 末尾 的字符串
截取從 開始 ~ 5 位置 的字符串
截取完整的字符串
從開始位置,每隔一個字符截取字符串
從索引 1 開始,每隔一個取一個
截取從 2 ~ 末尾 - 1 的字符串
截取字符串末尾兩個字符
字符串的逆序(面試題)
答案:
num_str = "0123456789"
# 1. 截取從 2 ~ 5 位置 的字符串
print(num_str[2:6])
# 2. 截取從 2 ~ `末尾` 的字符串
print(num_str[2:])
# 3. 截取從 `開始` ~ 5 位置 的字符串
print(num_str[:6])
# 4. 截取完整的字符串
print(num_str[:])
# 5. 從開始位置,每隔一個字符截取字符串
print(num_str[::2])
# 6. 從索引 1 開始,每隔一個取一個
print(num_str[1::2])
# 倒序切片
# -1 表示倒數第一個字符
print(num_str[-1])
# 7. 截取從 2 ~ `末尾 - 1` 的字符串
print(num_str[2:-1])
# 8. 截取字符串末尾兩個字符
print(num_str[-2:])
# 9. 字符串的逆序(面試題)
print(num_str[::-1])
5.公用語法
內置函數
函數描述備注
len(item)計算容器中元素個數
del(item)刪除變量del 有兩種方式
max(item)返回容器中元素最大值如果是字典,只針對 key 比較
min(item)返回容器中元素最小值如果是字典,只針對 key 比較
注意:字符串?比較符合以下規則: "0" < "A" < "a"
切片
描述Python 表達式結果支持的數據類型
切片"0123456789"[::-2]"97531"字符串、列表、元組
運算符
運算符Python 表達式結果描述支持的數據類型
+[1, 2] + [3, 4][1, 2, 3, 4]合并字符串、列表、元組
*["Hi!"] * 4['Hi!', 'Hi!', 'Hi!', 'Hi!']重復字符串、列表、元組
in3 in (1, 2, 3)True元素是否存在字符串、列表、元組、字典
not in4 not in (1, 2, 3)True元素是否不存在字符串、列表、元組、字典
> >= == < <=(1, 2, 3) < (2, 2, 3)True元素比較字符串、列表、元組
注意:
in 在對 字典 操作時,判斷的是 字典的鍵
in 和 not in 被稱為 成員運算符
完整for循環語法
for 變量 in 集合:
? ? 循環體代碼
else:
? ? 沒有通過 break 退出循環,循環結束后,會執行的代碼
例子:
students = [
? ? {"name": "阿土",
? ? "age": 20,
? ? "gender": True,
? ? "height": 1.7,
? ? "weight": 75.0},
? ? {"name": "小美",
? ? "age": 19,
? ? "gender": False,
? ? "height": 1.6,
? ? "weight": 45.0},
]
find_name = "阿土"
for stu_dict in students:
? ? print(stu_dict)
? ? # 判斷當前遍歷的字典中姓名是否為find_name
? ? if stu_dict["name"] == find_name:
? ? ? ? print("找到了")
? ? ? ? # 如果已經找到,直接退出循環,就不需要再對后續的數據進行比較
? ? ? ? break
else:
? ? print("沒有找到")
print("循環結束")
結果:
{'name': '阿土', 'age': 20, 'gender': True, 'height': 1.7, 'weight': 75.0}
找到了
循環結束
6.登陸信息存入字典
"""
注冊的校驗程序:
A)實現循環從鍵盤輸入用戶名和密碼
B)如果用戶名或者密碼任一一個輸入的是“QUIT”直接退出程序。
C)判斷用戶名長度為6-20,用戶名開頭必須以字母開頭。
D)密碼長度至少6位,不能為純數字,不能有空格。
E)如果不符合上述規則、打印出不符合的原因、提示重新輸入。并跳轉到用戶名輸入階段。
F)將正確的用戶名和密碼存入字典里,并打印校驗成功字樣。
"""
user_info = {}
while True:
? ? # 獲取用戶名和密碼
? ? username = input("input your username:")
? ? password = input('input your password:')
? ? # 如果用戶名或密碼任意一個是QUIT 直接退出
? ? if username == 'QUIT' or password == 'quit':
? ? ? ? break
? ? # 判斷用戶名長度在6-20
? ? elif len(username) < 6 or len(username) >20:
? ? ? ? print('用戶名長度不在6-20范圍內')
? ? ? ? break
? ? # 用戶名開頭字母判斷
? ? elif not username[0].isalpha():
? ? ? ? print('用戶名必須以字母開頭')
? ? ? ? break
? ? # 密碼格式判斷
? ? elif len(password) < 6 or password.isdigit() or " " in password:
? ? ? ? print("密碼長度至少6位,不能為純數字,不能有空格。")
? ? ? ? break
? ? else:
? ? ? ? user_info[username] = password
? ? print("校驗成功")
? ? print(user_info)
結果為:
input your username:dujinhang
input your password:djh123456
校驗成功
{'dujinhang': 'djh123456'}
input your username:zhangsan
input your password:zs123456
校驗成功
{'dujinhang': 'djh123456', 'zhangsan': 'zs123456'}
input your username:wangmazi
input your password:wmz123456
校驗成功
{'dujinhang': 'djh123456', 'zhangsan': 'zs123456', 'wangmazi': 'wmz123456'}
input your username:wangmaz
input your password:123456
密碼長度至少6位,不能為純數字,不能有空格。
注意:更改break位置可以實現一直循環輸入,刪除后面3個break可以實現一直循環輸入。刪除后最后新增一個break可以在正確輸入用戶名和密碼后結束
7.登陸
d = {'阿杜': 123456}
while True:
? ? name = input('請輸入您的用戶名:')
? ? if name in d:
? ? ? ? break
? ? else:
? ? ? ? print('您輸入的用戶名不存在,請重新輸入')
? ? ? ? continue
count = 5
while count:
? ? password = int(input('請輸入您的密碼:'))
? ? if d[name] == password:
? ? ? ? print('進入系統')
? ? ? ? break
? ? else:
? ? ? ? count -= 1
? ? ? ? print('您輸入的密碼不正確,還有{}次輸入機會'.format(count))
? ? ? ? continue
請輸入您的用戶名:阿杜
請輸入您的密碼:12345
您輸入的密碼不正確,還有4次輸入機會
請輸入您的密碼:123456
進入系統
8.
# 從鍵盤獲取5個學生的名字,然后隨機抽出一名學生去打掃衛生
import random
name_list = []
i = 0
while i < 5:
? ? name = input('輸入學生姓名')
? ? name_list.append(name)
? ? i += 1
a = random.randint(0, 4)
print('打掃衛生的學生是%s' % name_list[a])
結果:
輸入學生姓名張三
輸入學生姓名里斯
輸入學生姓名王麻子
輸入學生姓名郭達
輸入學生姓名杰森
打掃衛生的學生是杰森
注意:循環體要縮進,后續不循環的記得不要縮進!
DAY07 函數操作
1.定義函數的格式如下:
def 函數名():? ? 函數封裝的代碼
? ? ……
注釋:
在開發中,如果希望給函數添加注釋,應該在 定義函數的下方,使用 連續的三對引號,這種注釋是給函數用的,方便給調用的人知道函數是怎么用的;
在連續的三對引號之間編寫對函數的說明文字;
在函數調用位置,用使用鼠標點擊函數名后,然后使用快捷鍵 CTRL + Q 可以查看函數的說明信息。
2.函數參數
形參:定義?函數時,小括號中的參數,是給真實數據占位用的,在函數內部?作為變量使用
實參:調用?函數時,小括號中的參數,是傳遞到?函數內部?的?真實數據
例子:
a = 5
def test1(a):
? ? # 這里 a 是形參,是在函數內部定義的,作用域只在函數內部
? ? a += 1
? ? print("%d" % a)
test1(2)
# 這里因為形參的作用域不到這里,所以這個 a 是外面的 a
print("%d" % a)
結果:
3
5
注意,函數內部形參最好不要與外部變量同名
3.返回值
在程序開發中,有時候,會希望 一個函數執行結束后,告訴調用者一個結果,以便調用者針對具體的結果做后續的處理
在函數中使用 return 關鍵字可以返回結果
調用函數一方,可以使用變量來接收函數的返回結果,也可以不接收只調用。注意沒有返回值,也有返回值,是 None
注意:return 表示返回,后續的代碼都不會被執行
例子:
def func_sum():
? ? """求和 1+2"""
? ? sum_num = 1 + 2
? ? print(sum_num)
? ? return
? ? # 這行代碼不會執行了
? ? print('不會執行這行代碼')
res=func_sum()
print(res)
結果為;
3
None
例2:
# 計算1~num的累積和
def calculate_num(num):
? ? result = 0
? ? i = 1
? ? while i <= num:
? ? ? ? result = result + i
? ? ? ? i += 1
? ? return result
result = calculate_num(100)
print('1~100的累積和為:%d' % result)
4.函數的嵌套使用
定義一個函數能夠打印 5 行 的分隔線,分隔線要求任意符號任意行數
def print_line(a, b):
? ? print(a * b)
def print_lines(c, d):
? ? row = 0
? ? while row < 5:
? ? ? ? print_line(c, d)
? ? ? ? row += 1
print_lines("*", 30)
運行結果:
******************************
******************************
******************************
******************************
******************************
練習:
1.
# 設計一個程序,計算出 0-n 之間所有整數的和,并將計算的值返回。
def get_sum_num(n):
? ? i = 0
? ? sum_num = 0
? ? while i <= n:
? ? ? ? sum_num += i
? ? ? ? i += 1
? ? return sum_num
sum_num = get_sum_num(100)
print(sum_num)
注意:函數定義和循環體的冒號:
2.
"""
定義一個函數,要求輸入大于0的數字n,判斷傳入數字的奇偶性,如果是奇數返回 "n是奇數",否則返回 “n是偶數”,否則 返回“請輸入大于0的整數”
"""
def jiou(n):
? ? if n > 0:
? ? ? ? if n/2 == 0:
? ? ? ? ? ? return '%d是偶數' % n
? ? ? ? else:
? ? ? ? ? ? return '%d是奇數' % n
? ? else:
? ? ? ? return '請輸入大于零的整數'
result = jiou(135)
print(result)
結果:
135是奇數
3.
"""
編寫一個程序,通過鍵盤循環獲取5個學生的信息,將學生信息組成字典保存到列表中,最終將學生信息列表打印出來。(學生信息包括 name 、age、id)
"""
stu_list = []
stu_dict={}
i = 0
while i < 5:
? ? stu_dict = {}
? ? name = input("請輸入姓名:")
? ? age = input("請輸入年齡:")
? ? id_stu = input("請輸入學號:")
? ? stu_dict["name"] = name
? ? stu_dict["age"] = age
? ? stu_dict["id"] = id_stu
? ? stu_list.append(stu_dict)
? ? i += 1
print(stu_list)
運行結果:
請輸入姓名:張三
請輸入年齡:12
請輸入學號:123456
請輸入姓名:李四
請輸入年齡:23
請輸入學號:234567
請輸入姓名:王五
請輸入年齡:34
請輸入學號:456789
請輸入姓名:周六
請輸入年齡:45
請輸入學號:567891
請輸入姓名:劉七
請輸入年齡:56
請輸入學號:678912
[{'name': '張三', 'age': '12', 'id': '123456'}, {'name': '李四', 'age': '23', 'id': '234567'}, {'name': '王五', 'age': '34', 'id': '456789'}, {'name': '周六', 'age': '45', 'id': '567891'}, {'name': '劉七', 'age': '56', 'id': '678912'}]
DAY08 模塊和匿名函數
1.模塊
模塊是 Python 程序架構的一個核心概念
模塊就好比是 工具包,要想使用這個工具包中的工具,就需要導入 import 這個模塊
每一個以擴展名 py 結尾的 Python 源代碼文件都是一個模塊
在模塊中定義的 全局變量、函數都是模塊能夠提供給外界直接使用的工具
例子:
新建 info.py,代碼如下
name = "datafrog"
def func():
? ? print('info_func')
再新建 get_info.py 文件,并且編寫以下代碼:
import info
print(info.name)
info.func()
2.列表推導式:輕量級循環創建列表
例子:
a=[x for x in range(1,7) if x%2==0]
b=[x for x in range(1,7) if x%2!=0]
c=[x for x in range(1,7,2)]
print(a)
print(b)
print(c)
注意:第一個x可以是含x的參數
例2
d=[(x,y) for x in range(1,4) for y in range(3,5)]
輸出結果:
[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]
3.匿名函數:用lambda關鍵詞能創建小型匿名函數。這種函數得名于省略了用def聲明函數的標準步驟
例:
sum = lambda arg1, arg2: arg1 + arg2
# 調用sum函數
print("Value of total : %s" % sum( 10, 20 ))
print("Value of total : %s" % sum( 20, 20 ))
以上實例輸出結果:
Value of total :? 30
Value of total :? 40
例2:
下面的數據如何指定按age或name排序?
stus = [
? ? {"name": "zhangsan", "age": 18},
? ? {"name": "lisi", "age": 19},
? ? {"name": "wangwu", "age": 17}
]
按name排序:
stus.sort(key = lambda x: x['name'])
print(stus)
輸出結果:
[{'age': 19, 'name': 'lisi'}, {'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}]
按age排序:
stus.sort(key = lambda x: x['age'])
print(stus)
輸出結果:
[{'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}, {'age': 19, 'name': 'lisi'}
DAY09 函數高級
1.局部變量、全局變量
局部:函數內部定義
全局:函數外部定義
如果在函數中修改全局變量,那么就需要使用global進行聲明,否則出錯
例子:
a = 10
def test():
? ? global a
? ? a = 5? # 修改全局變量
? ? print("函數內a:%d" %a)
test()
print("函數外a:%d" %a)
運行結果:
函數內a:5
函數外a:5
2.函數返回值
例子:
def func2():
? ? return 1, 1.5
a = func2()
print(a)
a, b = func2()
print(a)
print(b)
a, b, c = 2, 2.5, "hello"
print(a)
print(b)
print(c)
結果 :
(1, 1.5)
1
1.5
2
2.5
hello
3.函數參數
默認參數:調用函數時,如果沒有傳入默認參數對應的實參,則實參使用默認值。
關鍵字參數:調用函數時,實參可以指定對應的形參,稱為關鍵字參數
例子:
def printinfo(name, age):
? # 打印任何傳入的字符串
? print("Name: %s"% name)
? print("Age: %s"% age)
printinfo(age=9,name="miki" )
結果:
Name: miki
Age: 9
可變參數
(1)、元祖:args
函數可以定義 可變參數,用于接收任意數量的參數
可變參數的前邊需要添加*,用于提示python解釋器該參數為可變參數
使用可變參數直接用args即可(不需要加*)
可變參數的本質是 將傳遞的參數包裝成了元組
(2)、字典:kwargs
可變參數還有一種形式 可以接收不存在的關鍵字參數
定義參數時需要在變量名前添加兩個*
這種可變參數會將 不存在的關鍵字參數包裝成字典
例子:
def sum_num(a, b, *args, **kwargs):
? ? print(a)
? ? print(b)
? ? print(args)
? ? print(kwargs)
? ? test(*args, **kwargs)
def test(*args, **kwargs):
? ? print(args)
? ? print(kwargs)
sum_num(1, 2, 3, mm=5, nn=6)
結果為:
1
2
(3,)
{'mm': 5, 'nn': 6}
(3,)
{'mm': 5, 'nn': 6}
例2:
#計算n到m的和,調用時可以不傳,或傳遞1個或傳遞兩個參數,默認計算1-100的和
def func3(n=1, m=100):
? ? i = n
? ? sum = 0
? ? while i <= m:
? ? ? ? sum += i
? ? ? ? i += 1
? ? return sum
print(func3(2, 5))
結果:
14
例3:#除法
def div(a, b, *args):
? ? # 如果b=0,就讓結果為a
? ? if b == 0:
? ? ? ? ret = a
? ? else:
? ? ? ? ret = a / b
? ? ? ? if args:
? ? ? ? ? ? for i in args:
? ? ? ? ? ? ? ? if i == 0:
? ? ? ? ? ? ? ? ? ? # 如果i=0,就跳過
? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ? ret = ret / i
? ? return ret
print(div(50, 2, 4))
例4:
# 使用不定長參數定義一個函數max_min,接受的參數類型是數值,最終返回這些數中的最大值和最小值
def max_min(*args):
? ? if len(args) == 0:
? ? ? ? return 0, 0
? ? elif len(args) == 1:
? ? ? ? return args(0), args(0)
? ? else:
? ? ? ? max = args[0]
? ? ? ? min = args[0]
? ? ? ? for i in args:
? ? ? ? ? ? if max < i:
? ? ? ? ? ? ? ? max = i
? ? ? ? ? ? if min > i:
? ? ? ? ? ? ? ? min = i
? ? ? ? return max, min
print(max_min(1,2,5,6,8,5,25,))
例5:
# 定義一個函數,返回n的階乘的最后結果,并打印出如5階乘"5!=120"的效果
def num_factorial(a):
? ? ret = 1
? ? for i in range(a):
? ? ? ? ret = ret * (i + 1)
? ? print("%d!=%d" % (a, ret))
num_factorial(5)
例6
# 定義一個函數,返回由n(包含n)以內的奇數或者偶數組成的列表,默認返回全是奇數的列表
def jiou(n, type="jishu"):
? ? res = []
? ? if type == "jishu":
? ? ? ? for i in range(1, n + 1):
? ? ? ? ? ? if i % 2 != 0:
? ? ? ? ? ? ? ? res.append(i)
? ? if type == "oushu":
? ? ? ? for i in range(i, n + 1):
? ? ? ? ? ? if i % 2 == 0:
? ? ? ? ? ? ? ? res.append(i)
? ? return res
print(jiou(15))
運行結果
[1, 3, 5, 7, 9, 11, 13, 15]
例7:
"""
定義函數findall,實現對字符串find方法的進一步封裝,要求返回符合要求的所有位置的起始下標,
如字符串"helloworldhellopythonhelloc++hellojava",需要找出里面所有的"hello"的位置,
最后將返回一個元組(0,10,21,29),即將h的下標全部返回出來,而find方法只能返回第一個
"""
def find_all(str1, date, start, end):
? ? list1 = []
? ? while start <= end:
? ? ? ? i = str1.find(date, start, end)
? ? ? ? if i == -1:
? ? ? ? ? ? break
? ? ? ? else:
? ? ? ? ? ? start = i + 1
? ? ? ? ? ? list1.append(i)
? ? return tuple(list1)? ? ? ? ? ? ? ? ? ? ? #元祖形式輸出
str1 = "helloworldhellopythonhelloc++hellojava"
date = "hello"
end = len(str1)
print(find_all(str1, date, 0, end))
運行結果
(0, 10, 21, 29)