Python3 與 C# 擴展之~基礎衍生

来源:https://www.cnblogs.com/dotnetcrazy/archive/2018/07/07/9278573.html
-Advertisement-
Play Games

本文適應人群:C# or Python3 基礎鞏固 代碼褲子: https://github.com/lotapp/BaseCode 線上編程: https://mybinder.org/v2/gh/lotapp/BaseCode/master 線上預覽:http://github.lesschin ...


 

本文適應人群:C# or Python3 基礎鞏固

代碼褲子: https://github.com/lotapp/BaseCode

線上編程: https://mybinder.org/v2/gh/lotapp/BaseCode/master

線上預覽:http://github.lesschina.com/python/base/ext/基礎衍生.html

馬上快期末考試了,老師蜜月也回來了,於是有了一場跨季度的複習講課了:

1.Python基礎語法擴展

1.1.if 判斷條件相關

None、""、0、[]、{} ==> 假

1、" "、[None,""]、{"":None} ==> 真

小明可高興了,前幾天被打擊的面目全非,這幾天老師回來了,又可以大發神威了,於是搶先提交demo:

In [1]:
# None
if None:
    print(True)
else:
    print(False)
 
False
In [2]:
# 0為False
if 0:
    print(True)
else:
    print(False)
 
False
In [3]:
# 空字元串
if "":
    print(True)
else:
    print(False)
 
False
In [4]:
# 空列表為False
if []:
    print(True)
else:
    print(False)
 
False
In [5]:
# 空字典為False
if {}:
    print(True)
else:
    print(False)
 
False
In [6]:
# 1為True
if 1:
    print(True)
else:
    print(False)
 
True
In [7]:
# 含空格
if " ":
    print(True)
else:
    print(False)
 
True
In [8]:
if [None,""]:
    print(True)
else:
    print(False)
 
True
In [9]:
if {"":None}:
    print(True)
else:
    print(False)
 
True
 

老師微帶笑容的看了小明一眼,然後接著講if的擴展

1.2.三元表達符

eg:max = a if a > b else b

In [10]:
a, b = 1, 2

max = a if a > b else b

print(max)
 
2
In [11]:
a, b, c = 1, 3, 2

max = a if a > b else b
max = max if max > c else c

print(max)
 
3
In [12]:
# 上面的那個還有一種簡寫(不推薦)
a, b, c = 1, 3, 2

max = (a if a > b else b) if (a if a > b else b) > c else c

print(max)
 
3
 

1.2.字元串和編碼

Python3.x版本中,字元串是以Unicode編碼的

對於單個字元的編碼,Python提供了ord()函數獲取字元的整數表示,chr()函數把編碼轉換為對應的字元

小潘對這塊有所研究,把小明按在桌上然後搶先提交demo:

In [13]:
ord('D')
Out[13]:
68
In [14]:
ord('毒')
Out[14]:
27602
In [15]:
chr(68)
Out[15]:
'D'
In [16]:
chr(27602)
Out[16]:
'毒'
In [17]:
print(ord('A'))
print(ord('Z'))

print(ord('a'))
print(ord('z'))
 
65
90
97
122
 

老師補充講解道:

編碼:encode() 解碼:decode()

url相關的可以用:

urllib.parse.quote() and urllib.parse.unquote()

urllib.parse.urlencode() 可以直接對一個key-value進行url編碼

In [18]:
# encode() and decode()
name="毒逆天"

name_encode=name.encode("utf-8")

print(name_encode)

print(name_encode.decode("utf-8"))
 
b'\xe6\xaf\x92\xe9\x80\x86\xe5\xa4\xa9'
毒逆天
In [19]:
# 需要導入urlib.parse

import urllib.parse
In [20]:
test_str="淡定"

# 對字元串進行url編碼和解碼
test_str_enode = urllib.parse.quote(test_str)

print(test_str_enode)

# urllib.parse.quote() 解碼
print(urllib.parse.unquote(test_str_enode))
 
%E6%B7%A1%E5%AE%9A
淡定
In [21]:
# urlencode 可以直接對一個key-value進行編碼

test_dict={"name":"毒逆天","age":23}

encode_str = urllib.parse.urlencode(test_dict)

print(encode_str)
print(urllib.parse.unquote(encode_str))
 
name=%E6%AF%92%E9%80%86%E5%A4%A9&age=23
name=毒逆天&age=23
 

1.3.值判斷和地址判斷

小明不樂意了,你個小潘總是搶我的風頭,看完標題就刷刷的在黑板上寫下瞭如下知識點:

is 是比較兩個引用是否指向了同一個對象id()得到的地址一樣則相同)

== 是比較兩個對象的值是否相等

在之前講Dict的時候提了一下可變和不可變類型:https://www.cnblogs.com/dotnetcrazy/p/9155310.html#5.2.增加和修改

Func裡面又系統的說了一下:https://www.cnblogs.com/dotnetcrazy/p/9175950.html#4.5.可變類型和不可變類型

對於可變不可變系列就不去覆述了,下麵再來幾個案例看看 值判斷地址判斷的概念

In [22]:
################ 可變類型 ################ 
In [23]:
a=[1,2,3]
b=[1,2,3]

# id不一樣,那is肯定不一樣了
print(id(a))
print(id(b))
 
139727165899464
139727165725256
In [24]:
# a和b是否指向同一個地址
a is b
Out[24]:
False
In [25]:
# a和b的值是否相同
a == b
Out[25]:
True
In [26]:
################ 開始變化了 ################ 
In [27]:
# 讓a指向b的地址
a=b

# a和b的id一樣了
print(id(a))
print(id(b))
 
139727165725256
139727165725256
In [28]:
# a和b是否指向同一個地址
a is b
Out[28]:
True
In [29]:
# a和b的值是否相同
a == b
Out[29]:
True
In [30]:
################ 不可變類型 ################ 
In [31]:
a=1
b=1

# id一樣
print(id(a))
print(id(b))
 
94592578394656
94592578394656
In [32]:
a is b
Out[32]:
True
In [33]:
a == b
Out[33]:
True
In [34]:
# 但是你要註意,不是所有不可變類型都這樣的

f1=1.2
f2=1.2

# 聲明兩個相同值的浮點型變數,查看它們的id,發現它們並不是指向同個記憶體地址(這點和int類型不同)
print(id(f1))
print(id(f2))
 
139727217917024
139727217917096
In [35]:
# 這個就不一樣了
# 這方面涉及Python記憶體管理機制,Python對int類型和較短的字元串進行了緩存
# 無論聲明多少個值相同的變數,實際上都指向同個記憶體地址,其他的就沒這福利咯~

f1 is f2
Out[35]:
False
In [36]:
f1 == f2
Out[36]:
True
 

2.Python總結之for系列

老師徐徐道來:“之前說for總是零零散散的,現在基礎都講完了,來個小彙總:”

2.1.Base

能夠被for迴圈遍歷的,就是可迭代的

For基礎系:https://www.cnblogs.com/dotnetcrazy/p/9102030.html#9.1.Python

In [37]:
# 類似於for(int i=0;i<5;i++)

for i in range(5):
    print(i)
    
 
0
1
2
3
4
In [38]:
#while迴圈一般通過數值是否滿足來確定迴圈的條件
#for迴圈一般是對能保存多個數據的變數,進行遍歷

name="https://pan.baidu.com/s/1weaF2DGsgDzAcniRzNqfyQ#mmd"

for i in name:
    if i=='#':
        break
    print(i,end='')#另一種寫法:print("%s"%i,end="")
print('\n end ...')
 
https://pan.baidu.com/s/1weaF2DGsgDzAcniRzNqfyQ
 end ...
In [39]:
# 你期望的結果是:i = 5

for i in range(10):
    if i == 5:
        print("i = %d" % i)
else:
    print("沒有找到")
 
i = 5
沒有找到
In [40]:
# 當迭代的對象迭代完併為空時,位於else的子句將執行
# 而如果在for迴圈中含有break時則直接終止迴圈,並不會執行else子句
# 正確寫法如下:

for i in range(10):
    if i == 5:
        print("i = %d" % i)
        break
else:
    print("沒有找到")
 
i = 5
In [41]:
# 遍歷一個字典

test_dict={"Name":"小明","Age":23}

for k,v in test_dict.items():
    print("key:%s,value:%s"%(k,v))
 
key:Name,value:小明
key:Age,value:23
 

2.2.列表生成式

如果下麵知識點還不熟悉的,看看之前講的~列表生成式:https://www.cnblogs.com/dotnetcrazy/p/9155310.html#1.9.列表生成式

簡寫list(range(1, 11)) 全寫[x for x in range(1,11)]

In [42]:
list(range(1, 11))
Out[42]:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [43]:
[x for x in range(1,11)]
Out[43]:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [44]:
# 1~10的平方列表
[x*x for x in range(1,11)]
Out[44]:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
In [45]:
# 1~10之間的偶數
[x for x in range(1, 11) if x % 2 == 0]
Out[45]:
[2, 4, 6, 8, 10]
In [46]:
# 數學裡面的全排列
[x + y for x in 'ABC' for y in 'AB']
Out[46]:
['AA', 'AB', 'BA', 'BB', 'CA', 'CB']
In [47]:
# 數學裡面的坐標軸
[(x,y) for x in range(1,5) for y in range(1,4)]
Out[47]:
[(1, 1),
 (1, 2),
 (1, 3),
 (2, 1),
 (2, 2),
 (2, 3),
 (3, 1),
 (3, 2),
 (3, 3),
 (4, 1),
 (4, 2),
 (4, 3)]
In [48]:
# (x,y,z) 一般三個嵌套就上天了
[(x,y,z) for x in range(1,5) for y in range(1,4) for z in range(1,3)]
Out[48]:
[(1, 1, 1),
 (1, 1, 2),
 (1, 2, 1),
 (1, 2, 2),
 (1, 3, 1),
 (1, 3, 2),
 (2, 1, 1),
 (2, 1, 2),
 (2, 2, 1),
 (2, 2, 2),
 (2, 3, 1),
 (2, 3, 2),
 (3, 1, 1),
 (3, 1, 2),
 (3, 2, 1),
 (3, 2, 2),
 (3, 3, 1),
 (3, 3, 2),
 (4, 1, 1),
 (4, 1, 2),
 (4, 2, 1),
 (4, 2, 2),
 (4, 3, 1),
 (4, 3, 2)]
 

2.3.擴展

如果要對list實現類似C#或者java那樣的下標迴圈怎麼辦?

這塊小明又有預習,於是在提交Code的同時大聲說道:

Python內置的enumerate函數可以把一個list變成索引-元素對,這樣就可以在for迴圈中同時迭代索引和元素本身

In [49]:
for i, item in enumerate(['A', 'B', 'C']):
    print(i, item)
 
0 A
1 B
2 C
 

3.Python中賦值、淺拷貝、深拷貝

看到標題小明和小潘就楞了,老師當時沒講解啊,然後兩個人眼巴巴的看著老師講解:

官方文檔:https://docs.python.org/3/library/copy.html

3.1.賦值

通過=來實現,就是把地址拷貝了一份,比如 a = b

In [50]:
a=[1,2,2]
b = a

print(id(a))
print(id(b))
 
139727165518536
139727165518536
In [51]:
# 再驗證

a.append(3)

# 都增加了一個3,說明的確指向同一個記憶體地址
print(a)
print(b)
 
[1, 2, 2, 3]
[1, 2, 2, 3]
 

3.2.深拷貝deepcopy

導入copy模塊,調用deepcopy方法

如果有嵌套引用的情況,直接遞歸拷貝

In [52]:
import copy

a=[1,2,2]
In [53]:
b=copy.deepcopy(a)

# 指向了不同的記憶體地址
print(id(a))
print(id(b))
 
139727165899080
139727165900488
In [54]:
# 再驗證一下

a.append(3)

# b不變,說明的確指向不同的記憶體地址
print(a)
print(b)
 
[1, 2, 2, 3]
[1, 2, 2]
In [55]:
################ 開始變化了 ################ 
In [56]:
# 之前講了嵌套列表,我們來驗證一下

a=[1,2,2]
b=[1,2,3,a]

c=copy.deepcopy(b)

# 發現地址都不一樣
print(id(b))
print(id(c))
print(id(b[3]))
print(id(c[3]))
 
139727166586248
139727165899080
139727165725256
139727165899464
In [57]:
# 直觀的驗證一下

a.append(666)

# 深拷貝的確是深拷貝
print(b)
print(c)
 
[1, 2, 3, [1, 2, 2, 666]]
[1, 2, 3, [1, 2, 2]]
 

3.3.淺拷貝copy

copy只是簡單拷貝,如果拷貝內容裡面還有引用之類的,他是不管的

In [58]:
import copy

a=[1,2,2]
In [59]:
b=copy.copy(a)

# 指向了不同的記憶體地址
print(id(a))
print(id(b))
 
139727165902088
139727165850952
In [60]:
################ 開始變化了 ################ 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3121 Accepted Submission(s): 778 Problem Descript ...
  • Description Input 第1行包含5個整數,依次為 x_0,a,b,c,d ,描述小H採用的隨機數生成演算法所需的隨機種子。第2行包含三個整數 N,M,Q ,表示小H希望生成一個1到 N×M 的排列來填入她 N 行 M 列的棋盤,並且小H在初始的 N×M 次交換操作後,又進行了 Q 次額外 ...
  • Flask中的session cookie:是一種保存數據的格式,也可以看成是保存數據的一個“盒子”,伺服器返回cookie給瀏覽器(由伺服器產生),由瀏覽器保存在本地,下次再訪問此伺服器時瀏覽器就會自動將此cookie一起發送給伺服器。 session:也是一種保存數據的格式,也可以看成是保存數據 ...
  • 一、正則表達式簡介 正則表達式是一個特殊的字元序列,它能幫助你方便的檢查一個字元串是否與某種模式匹配。 Python 自1.5版本起增加了re 模塊,它提供 Perl 風格的正則表達式模式。 就其本質而言,正則表達式(或 RE)是一種小型的、高度專業化的編程語言, (在Python中)它內嵌在Pyt ...
  • 開始整理線程之前,之前有個命令忘記整理了,先整理一下jar命令的使用 Jar包 其實可以理解是java的壓縮包方便使用,只要在classpath設置jar路徑即可資料庫驅動,ssh框架等都是以jar包體現的 打包方式一:將指定的class文件打入到jar包中jar cvf xxx.jar Xxx.c ...
  • 切庫的基礎和實際運用—讀寫分離: 如何方便進行讀寫分離,目前有兩種方式: 1.動態數據源切換 它是指程式運行時,把數據源動態的織入到程式中,讓指定的程式連接主庫還是從庫 自定義註解完成資料庫切庫 2.直接定義查數據源和寫數據源 直接在項目里定義兩個資料庫連接,一個是主庫連接一個是從庫連接,更新數據的 ...
  • 通過jdbc插入java.util.date類型的時間代碼示例: 資料庫裡面的列是datetime類型的用 ps.setString(3, time); 插入數據,完全可以的。 資料庫插入的數據顯示: 網頁數據顯示: ...
  • python3 最重要的新特性是對文本和二進位數據作了更為清晰的區分,文本總會Unicode,有str類型表示,二進位數據則是由bytes類型表示。python3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別明顯。 但是,字元串可以編碼成位元組包,而位元組包可以解碼成字元串。如圖所 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...