一小時入門 Python
因為需求, 需要用到py, 所以來學學py, 因為有java基礎 一小時入門py語法是不成問題的, 但是僅僅入門基礎語法而已, 不涉及演算法,不涉及大資料,機器學習,人工智慧, 但是py這麼火爆,就在於這幾個分支遍地開花,後續的路還好長啊
py的語法是真的簡單, 跟java比,真的簡單太多了, 而且他的程式碼很有條理, 因為他是嚴格控制縮排的,在一個縮排塊中,就好比一個隱形的大括號一樣,限制著變數的宣告週期
命名:檔案/識別符號/關鍵字
- 識別符號: 程式設計師定義的變數名,函式名
- 可以由字母數字下劃線組成
- 不能用數字開頭
- 不能和已經存在的關鍵字重名
- 關鍵字: Python內建的識別符號
- 檔名: 不推薦檔名以數字開頭,否則不能通過import關鍵字匯入其他檔案使用
註釋
- 單行註釋使用 #
- 多行註釋使用 ''' XXX '''
算數運算子
+ - * / == != > < >= <= %
加減乘除的使用方法和其他語言完全相同
//
取整數 求商
9//2=4
**
冪運算
2**3=8
列表常見運算
print([1,2]+[3,4])#[1, 2, 3, 4]
print([1,2]*2)#[1, 2, 1, 2]
print(3 in [1,2,3])#True
print(3 not in [1,2,3])#False
對全域性列表使用+=操作,相當於extend函式**
def test(list): list+=list print(list)#[1, 3, 4, 1, 3, 4] gl_list=[1,3,4] test(gl_list) print(gl_list)#[1, 3, 4, 1, 3, 4]
全域性變數使用 = 賦值
不可變 全域性變數在函式內部 使用 = ,這種賦值操作, 原全域性變數不會被影響
gl_num=1
def test(num):
print(num)#1
num=2
print(num)#2
num+=3
print(num)#5
test(gl_num)
print(gl_num)#1
在函式中, 如果全域性變數是可變型別的, 如果在函式中往這個全域性變數中新增內容了, 全域性變數的值會受到影響
gl_num=[1,3,4] def test(num): print(num)#[1, 3, 4] num+=[1] print(num)#[1, 3, 4, 1] test(gl_num) print(gl_num)#[1, 3, 4, 1]
賦值運算子
=
+=
-=
*=
/= 除法賦值運算子
//= 取整賦值運算子
%= 取模賦值運算子
**= 冪賦值運算子
轉義運算子
\t 在控制檯上輸出一個製表符
\n 在控制檯上輸出一個換行符
\\ 反斜槓符
\' 輸出單引號
\r 回車
變數
變數的命名:
- 區分大小寫 Abc != abc
- 為了保證程式碼的質量, = 兩邊預留兩個空格
- 所有單詞全是小寫位元組
- 單詞之間使用下劃線連線 first_name
在py中,變數的型別是有不需要程式設計師指定,因為它是在執行時,由直譯器自己推斷出來的
例:
name="小明" # str 字串型別
age=18 # int 整形
sex= True # bool 布林型別 True False 首字母都是大寫
height=1.78 # float 單精度小數型別
weiht=75.0 # float
weiht2=75 # int
- 數字型
- int: 整形
- float: 浮點型
- bool:布林型
- True: 所有非0的數字
- False:0
- 複數型別: complex
- 主要用於科學計算
- 非數字型:
- str:字串
- 列表
- 元組
- 字典
```py
在py2.0中
type(2 ** 32) --> int
type(2 ** 64) --> long
在py3.0中 全部都是 int, 在py中的計算能力,完爆其他語言
print(type(2 ** 32))
print(type(2 ** 64))
print(type(2 ** 128))
print(type(2 ** 256))
print(type(2 ** 512))
print(type(2 ** 1024))
type函式可以直接檢視變數的型別
print(type(name)) # 結果 <class 'str'>
- 相同型別之間的計算規則
- 數值型變數之間的計算
- bool型, True被轉換成1 False被轉換成0
- 字串之間使用 + 拼接成連續串
- 不同型別資料之間的計算規則
- 字串 * 整數 實現重複拼接串
print("$"*10)#$$$$$$$$$$
- 數字型變數和字串之間不能進行其他型別操作
d=10
f="10.5"
g=True
print(d+f+g)#TypeError: unsupported operand type(s) for +: 'int' and 'str'
- 變數的輸入輸出
passwd = input("請輸入密碼")
print(passwd)
print(type(passwd))
- 型別轉換
型別轉換函式
int(X)#將輸入轉換成整數
float(X)#將輸入轉換成浮點型
- 變數的格式化輸出
%s: 字串
%d: 有符號十進位制整數 %06d 表示輸出的整形顯示的位數, 不足的地方使用0補全
%f: 浮點型 %.02f 表示顯示小數點後兩位
%%: 輸出%
q=999
print("格式化的字串是 %06d "%q)#000999
w=123.123456
e=123.123456
r=123.123456
print("格式化的字串%.2f"%w)#123.12
print("%.1f %.2f %.3f"% (w,e,r))#123.1 123.12 123.123
t=0.25
print("%.2f%%" % t)#0.25%
- 全域性變數
全域性變數推薦定義在全部程式碼的最上方
全域性變數的推薦命名規則
g_XXX gl_XXX
如何在 函式內部修改全域性變數?
先使用 global 進行修飾,再修改
高階變數
如: 列表 元組 字典 字串 公共方法
在python中全部的非數字型變數都支援以下特點
- 都是一個序列, 也可以理解成容器
- 取值 []
- 遍歷 for in
- 計算長度,最大/小 值 比較 刪除
- 連線+ 重複*
- 切片
列表
列表,在java叫陣列
雖然列表可以儲存不同型別的資料,但是絕大多數情況下, 用它儲存相同型別的資料
使用 [] 定義, 資料之間使用 , 分隔
列表的索引從 0 開始
py中提供的常用操作
python 中對列表提供的操作
1. 增加 列表insert(索引,資料) 在指定位置插入資料
列表append(資料) 在末尾追加資料
列表extend(列表2) 將列表2的資料追加到列表
2. 修改 列表[索引]=新值 修改指定索引的資料
3. 刪除 del列表[索引] 刪除指定索引的資料
列表.remove[資料] 刪除第一個出現的指定的資料
列表.pop 刪除末尾的資料
列表.pop(索引) 刪除指定索引的資料
列表.clear 清空列表
4. 統計 len(列表) 列表長度
列表.count(資料) 資料在列表中出現的次數
5. 排序 列表.sort() 升序
列表.sort(reserve=true) 降序排序
列表.reserve() 逆序,反轉
6. 取索引 列表.index(資料) 返回資料在列表中的索引
- 把變數從記憶體中刪除掉
del name_list[0]
print(name_list[0])
- 第一個引數位置的self 直接忽略就行
- 迭代
for name in name_list:
print(name)
元組
元組 Tuple 和列表類似,但是元組的元素 不能修改
通常使用 元組 儲存不同型別的資料
元組表示多個元素組成的序列
下標從0開始
使用者儲存一串資訊, 資料之間使用 逗號 分隔
- 定義元組
info_tuple = ("zhangsan",18,1.75)
print(type(info_tuple)) # <class 'tuple'>
- 取值
print(info_tuple[0])
print(info_tuple[1])
print(info_tuple[2])
# print(info_tuple[3])#tuple index out of range
- 取索引
print(info_tuple.index("zhangsan")) # 0
- 統計計數
print(info_tuple.count("zhangsan")) # 1
- 定義空元組,一般是不定義空元組的,但是沒意義,因為不能再修改
empty_tuple = ()
print(type(empty_tuple))#<class 'tuple'>
- 定義一個元素的元組
single_touble1 = (5) # 直譯器會忽略兩個小括號
print(type(single_touble1))# <class 'int'> 被直譯器解釋成了int型別
single_touble2 = (5,) # 多加上一個逗號
print(type(single_touble2))#<class 'tuple'>
- 元組的應用場景
- 作為入參: 可以使得函式一次性接受多個引數
- 讓列表不可變,保護資料的安全
- 作為返回值: 可以使函式一次性返回多個值
- 格式化字串, 在print函式中,格式化字串時, 格式化字串後面的() 本質上就是一個元組
例:
print("年齡: %d 姓名:%s"%(123,"小明"))
info_tuple = ("zhangsan",18,1.75)
print(type(info_tuple)) # <class 'tuple'>
info_str="姓名:%s 年齡: %d 身高%.2f "% info_tuple
print(info_str)
- 列表轉元組
my_list = [1,3,4,5]
my_list = tuple(my_list)
print(type(my_list)) # my_list
- 函式返回元組
def mea():
a=1
b=2
return (a,b)
# 接受
result = mea()
# 使用
print(result[0])
print(result[1])
# 也可以這樣接收, 注意, 變數的格式和元組的數保持一致
gl_a, gl_b = mea()
字典
字典是 無序物件 的集合 類似java中的 map,或者說是java中的一個物件
說它是無序,使用print輸出時,每次的順序不唯一
因為我們只關心通過key 取出 儲存的資料,而不關心儲存的順序
字典使用{}定義
字典使用鍵值對儲存資料, 鍵值對使用 逗號分隔
key 是索引,並且是 不可變型別的變數才能當key (列表,字典是可變型別,不能當成key)
value 是資料
鍵和值之間使用 : 冒號分隔
鍵是唯一的
值任意資料型別
* 定義字典
person={"name":"張三","age":23}
- 取值
# 取值
print(person["name"])# 入參位置的name是key
# print(xiaoming["name123"])# KeyError: 'name123' key不存在,程式會報錯
- 新增修改
# 新增/修改, 如果key存在了, 就是修改, key不存在就是新增
person["height"]=1.78
print(person)
- 刪除
person.pop("age")
print(person)
- 統計鍵值對的數量
print(len(person))
- 合併字典
new_dir={"class":"大一"}
person.update(new_dir) # 如果被合併的字典中包含原有的鍵值對, 會覆蓋舊值
print(person)
- 清空字典xiaoming
xiaoming.clear()
print(xiaoming)
- 遍歷
for k in person:
print(" value = %s "%person[k])
- 字典和列表搭配使用
將多個字典存入一個列表中,然後遍歷列表對實現對字典批量處理的動作
list = [
{},
{},
{}
]
if分支判斷語句
if 要頂格寫
if 條件1:
XXX
elif ()or()or():
XXX
else:
XXX
嚴格控制縮排, tab 和 空格不能混用,容易亂
邏輯運算子
與 and
或 or
非 not
條件1 and 條件2
條件1 or 條件2
對條件取反
not 條件1
not 條件2
迴圈
- for迴圈
for 變數 in 集合:
XXX
else:
XXX
- while迴圈
i=0
while i<5:
print("i= %d"%i)
#i=i+1
i+=1
函式
格式如下
def 函式名():
XXX
XXX
def 函式名():
XXX
XXX
return XXX
內建函式
- 隨機數
import random
n = random.randint(1,5)# 1 <= n <= 5
m = random.randint(5,5)# n = 5
# s = random.randint(10,5)# 第一個數大於第二個數則儲存
print("age== %d "%n)
預設引數
- 預設引數, 簡化人們的編碼
gl_list=[5,126,7]
gl_list.sort()
print(gl_list) # 預設正序
gl_list.sort(reverse=True) # 預設引數位置,可以設定逆序
print(gl_list)
- 指定預設引數的預設值
def print_info(name,gender=True):
default_gender="男生"
if not gender:
default_gender = "女生"
print("%s 是 %s"%(name,default_gender))
print_info("小明")
print_info("小明",False)
注意事項:預設引數必須保證它出現在 !!! 引數列表的末尾 !!!
- 如何呼叫含有多個引數, 如果有多個引數的話, 中間位置的引數最好也設定上預設值
def print_info(name,age="",gender=True):
default_gender="男生"
if not gender:
default_gender = "女生"
print("%s 是 %s"%(name,default_gender))
print_info("小明")
print_info("小明",gender=False)
- 多值引數
在引數名前新增一個 * 可以接收元組
在引數名前新增兩個 * 可以接收字典
習慣用下面的方式命名:
- *args :存放元組
- **kw :存放字典資料
def demo(num,*nums,**person):
print(num)
print(nums)
print(person)
demo(1)
'''
1
()
{}
'''
demo(1,23,4,5,6)
'''
1
(23, 4, 5, 6)
{}
'''
demo(1,23,4,5,6,name="張三",age=18)
'''
1
(23, 4, 5, 6)
{'name': '張三', 'age': 18}
'''
# 對比去除* 的寫法, 其實使用者在使用時變麻煩了,多增加了一個小括號
def print_info1(name):
print(name)
print_info1((1,2,3,4))#(1, 2, 3, 4)
元組和欄位的拆包
def demo(*args,**kwargs):
print(args)
print(kwargs)
gl_nums=(1,2,3)
gl_dir={"name":"李四","age":12}
demo(gl_nums,gl_dir)
'''
下面的執行結果其實是差強人意的, 需要進行拆包
((1, 2, 3), {'name': '李四', 'age': 12})
{}
'''
# 不拆包,直接呼叫
demo(1,2,3,name="李四",age=123)
'''
(1, 2, 3)
{'name': '李四', 'age': 123}
'''
# 拆包
demo(*gl_nums,**gl_dir)
'''
(1, 2, 3)
{'name': '李四', 'age': 12}
'''