【Python】Python一些有趣而基础的知识(结合Java进行对比)
1.格式化輸出:
your_name = "Bob" my_name = "Sam" print(f"Hello, {your_name}! I'm {my_name}")輸出結果:
Hello, Bob! I'm Sam2.格式化輸出:
print("Hello, my name is {}.".format("Sam"))輸出結果是:
Hello, my name is Sam.3.三種方法實現單行、多行注釋:
法1:
單行注釋:Shift + #(在代碼的最前面輸入,非選中代碼進行注釋)
多行注釋:同單行一樣在每一行的前面輸入Shift+#
法2:
單行和多行一樣的方式:選中需要注釋的代碼,Ctrl+/,寫Java的時候就是常用的方法
法3:
輸入''' '''或者""" """,將要注釋的代碼插在中間
4.Python與Java在*的非數值運算用法的對比:
首先看一下Java的'a'*10:
System.out.println('a'*10);得到:
970然后是Java的"a"*10:
System.out.println("a"*10);會報錯的。
解釋:
Java中’a’的類型為char,char實際上是一個數值按照其ASCII碼值映射的字符,可以做數值運算。'a’的ASCII碼值為97,相當于97*10=970。
Java中的字符串不可以與數值相乘。
再看看Python:
print('a'*10) print("a"*10)得到:
aaaaaaaaaa aaaaaaaaaa解釋:
""和''其實是等效的,*在Python里可以用來將字符/字符串復制n遍,這里是10遍。
5.Python與Java在+的非數值運算用法的對比:
首先看一下Java的'a'+10:
System.out.println('a'+10);得到:
107然后是Java的"a"+10:
System.out.println("a"+10); a10解釋:
Java中’a’的類型為char,char實際上是一個數值按照其ASCII碼值映射的字符,可以做數值運算。'a’的ASCII碼值為97,相當于97+10=>107。
Java中的字符串的+相當于把10變為字符串與已有字符串連接,得到“a10”。
再看看Python:
print('a'+10) print("a"*10)都會報錯。
即使這樣:
print("a", 10)也是相當于打印兩個變量,中間會有空格,始終不是一個變量。
解釋:
""和''其實是等效的,在Python里字符串不能與數值直接相加。
6.""""""是可以的,“ “ “ ” ” ”是不對的。
7.直接將用戶輸入轉化:
轉成int:
轉成float:
y = float(input())8.Python的print()從某種程度上相當于Java的System.out.println()或者說C#的Console.Writeline(),這是說執行后會換行。如果我們不想換行,可以這樣:
print("Hello, ", end=' ')9.格式化的強化:
formatter = "{} {} {}"print(formatter.format(7, 9, 8)) print(formatter.format("李華", "李剛", "李想")) print(formatter.format(formatter, formatter, formatter)) print(formatter.format(True, True, False)) print(formatter.format("哈哈", "嘎嘎", "呵呵"))結果:
7 9 8 李華 李剛 李想 {} {} {} {} {} {} {} {} {} True True False 哈哈 嘎嘎 呵呵10.導入命令行參數
from sys import argva, b, c, d = argvprint("a is: ", a) print("b is: ", b) print("c is: ", c) print("d is: ", d)可以在命令行運行的時候輸入命令行參數:
test.py BeiJing ShangHai GuangZhou ShenZhen這個就好像Java里面
public static void main(String[] args){}這個語句的args[]數組。
傳入的都是字符串,哪怕是1,2,3這樣的數值。
11.一些Python的庫介紹
| Django | Web開發工具庫 |
| Numpy | 大量的維度數組與矩陣運算的數學函數庫 |
| Matplotlib | 數據可視化庫,多與Numpy配合使用 |
| Scipy | 機器學習和數值分析庫 |
| Pandas | 數據操縱和分析庫 |
| PyGame | 游戲開發庫,帶圖形界面和聲音 |
| ScraPy | 網絡爬蟲庫 |
| TensorFlow | 機器學習和數據可視化庫 |
| Requests | 簡單易用的HTTP庫 |
| Kivy | 桌面應用和移動平臺的用戶界面庫 |
| Natural Language Tool Kit | 自然語言處理庫,可用于分析文本、垃圾郵件過濾、自動聊天機器人 |
12.雖然Python的命名多采用下劃線_,但是類的命名建議采用駝峰式。
13.建議采用比較一致的方式組織函數或者類的方法,比如:函數A參數為(x, y, z),B也需要用到x, y, z,那相對來講寫成(x, y, z)總比(y, z, x)易于管理。
14.好好寫注釋,好好寫文檔!!
15.代碼內部適當留白,應該有必要的空格或者空行以增強可讀性。
16.像JavaScript這種原型(prototype)語言中,類和對象除了用法以外沒多少不同,對象從某種程度上可以看做類的副本,然而Python里面類很像創建對象的模板,這點和Java類似。
17.對父構造器的引用
super和__init__的搭配使用:
在Java里就是相當于:
super();18.大部分可以使用繼承的場合都可以使用組合取代或者簡化,而多重繼承則需要不惜一切地避免。
(Java沒有多繼承并利用Interface來補充缺乏多繼承的靈活性)
19.Python有這樣的寫法:class className(object),object可以省略。這就好像Java里所有的類都是java.lang.Object的子類,然而并沒有必要去寫public class A extends Object {}。
20.Python面向對象里的self就可以用Java里的this來理解,只不過兩門編程語言還是有語法使用上的差別的。
21.Python中有一種“key-value”的模式,應用廣泛。
這個東西不要僅僅想到“字典”數據結構,再想想,是不是模塊啊,類啊也是通過"XXX.key"的方式調用出"value"的呢?
這個概念是一個廣泛應用的概念。
Java的java.util.HashMap也是k-v結構。
22.模塊(module)的一些說明:
- 模塊是包含函數和變量的Python文件(.py)
- 可以導入這些文件(import)
- 可以使用.操作符訪問模塊中的函數和變量
- 類與模塊也是異曲同工的,只不過一個面向過程,一個面向對象
23.collections.OrderedDict是可排序的字典結構。
字典這東西,Java也有java.util.Dictionary,可以用Java里的java.util.Map類比,都是“key-value”。
至于能排序的Dic,Java的java.util.TreeMap說的直白點兒,不就是紅黑樹支持的排序Map嗎……
24.Python的切片語法糖很實用,Java就必須順著來,Python就無所謂,可以正著來也能倒著來,還能一端“開放不限界”。不過,“左閉右開”是通用的。
25.通用的經驗:不要等全部開發完再測試,單元測試、模塊化的測試應該及時的做好。
26.Java里面啊,想給用戶輸入加提示信息就非得先Sytem.out.print()一下,Python就可以直接在input()里加入參數,這個參數其實是打印給用戶看的。
x = input("請輸入一個數字")27.Python的簡單輸入較之Java比較簡潔。
先看看Python的寫法:
看看Java的寫法:
//類和方法省卻了……直接寫代碼 Scanner scan = new Scanner(System.in); String x = scan.next(); scan.close();28.Python的for循環寫起來更簡潔,而且其for-each寫法顯得更簡單。
引入循環結構要注意防止死循環。
根據Java編譯后的結果,for(;;)和while(true)其實是等效的。
29.列表和數組的區別需要因編程語言而異。
從傳統的、經典的定義看來,二者很不同,但是現在的很多編程語言有一些與傳統規定不同的地方。
Ruby里面列表、數組統稱數組。
Python里面列表、數組統稱列表。
Java只有數組,列表需要看java.util.ArrayList。
30.in range()這個操作不只是用于for i in range(x),后面的參數可以加上另一側邊界值和步長:
x = int(input("請輸入一個整數,將檢查其是否在1~5")) print(x in range(1, 6))31.Python支持not or (或非)和 not and (與非)的寫法是:
not(a and b) not(a or b)32.readline()讀文件,關鍵在于讀“\n”。同樣的,該函數返回結果帶有“\n”換行符,這個是需要注意的。
print的話可以加一個end=’ '參數。
33.open文件支持指定字符集:
lang = open("lang.txt", encoding="utf-8")34.函數參數可能出現*args:
def f(*args):# balabala其實就是和argv那東西挺像,只不過這是函數調用,那是命令行參數傳入程序。
35.看這樣的寫法:
data = open(file).read()這樣的話就沒法運行close()了,因為read()一旦運行,文件就會被Python關掉。
36.exists可以先判一下文件存在不存在
from os.path import exists上面的語句可以調出來exists。
print(f"這個文件存在嗎?{exists(file)}")Java給我印象很深的一個是instanceof,能在ClassCast的時候安全一些。
37.Python增量賦值語法:
var = var + 1或者是
var += 1但是下面的語句會報錯:
var++這就比較起Java、C等編程語言,是一個需要適應的點,畢竟沒有簡便的++var和var++了啊!
不過,Java里非整型變量不能直接自增自減。
Python畢竟不是直接定義了類型,所以這么寫也是可以理解的啊。
38.Python運算符有一些和Java、C等編程語言不同的點:
它支持整除//、非整除/和指數**兩種運算。
Java里想做指數運算就比這個麻煩得多:
39.eval()、int()、float()、str()函數可以直接用于input()函數內部,也可以另作他用。
print(int("23")) print(float("23")) print(eval("23")) print(str(23)) print(eval("23.5")) x = 5 print(eval("23 + (2 *x)"))輸出:
23 23.0 23 23 23.5 33歸納:
- int()可以將字符串轉換成整型
- float()可以將字符串、整型轉換成浮點型
- str()可以將數值型轉換成字符串
- eval()可以計算相應表達式,賦值為相應的數值類型(整型或浮點型)
40.下面是表示字符串內行連續的兩種方式,請看下面的示例:
a = "Hello, " + \"World!" b = ("Hello, " + "World ~ Again!")而Java由于是{} 、[]、()、;這些起到分隔作用的來決定,String的對象可以這么寫:
String a = "Hello, " + "World!";41.Python的print()有兩個需要記住的參數:
sep=“” 和 end=""
看下面的例子:
輸出結果
總結:
sep="sepString"中,sepString替換了分隔符Space(" ")
end="endString"中,endString替換了換行符Enter("\n")
42.Python輸出域內對齊:如果字符串長度沒達到指定的長度,則不夠的部分用空白補齊;否則(超出長度),對齊無效。
對齊方式三種:
- ljust(n):左對齊
- rjust(n):右對齊
- center(n):居中對齊
看下面的例子:
print("012345678901234567890123456789") print("Rank".ljust(5), "Player".center(22), "HR".rjust(3), sep="") print("1".ljust(5), "XiaoBiao".center(22), "100".rjust(3), sep="") print("2".ljust(5), "XiaoChi".center(22), "98".rjust(3), sep="") print("3".ljust(5), "XiaoDai".center(22), "93".rjust(3), sep="") print("4".ljust(5), "XiaoSha".center(22), "60".rjust(3), sep="")非常遺憾的是,我們用中文就不怎么理想:
43.格式化數值(主要是浮點數)輸出:
| print("{0:10d}".format(12345678)) | 12345678 | 數字是個整型 |
| print("{0:10,d}".format(12345678)) | 12,345,678 | 添加千分符 |
| print("{0:10.2f}".format(1234.5678)) | 1234.57 | 四舍五入 |
| print("{0:10,.2f}".format(1234.5678)) | 1,234.57 | 四舍五入并添加千分符 |
| print("{0:10,.3f}".format(1234.5678)) | 1,234.568 | 四舍五入并添加千分符 |
| print("{0:10.2%}".format(12.345678)) | 1234.57% | 轉換為百分數、四舍五入并添加千分符 |
| print("{0:10,.3%}".format(12.345678)) | 1,234.568% | 轉換為百分數、四舍五入并添加千分符 |
44.列表的split()和join()方法:
- split():將字符串分割生成列表
- join():將列表元素拼接成字符串
看下面的例子:
print("a,b,c".split(",")) print("a**b**c".split("**")) print("a\nb\nc".split()) print("a b c".split())查看輸出:
注意,split()方法沒傳參數,參數默認是空白字符,這個空白字符可以是Space、Tab、Enter。
hello = ["H", "e", "l", "l", "o"] print(hello) print(" ".join(hello)) world = ["W", "o", "r", "l", "d"] print(", ".join(world))這種操作是非常常見的,而Python的支持也使其變得十分簡單。
這方面Java也有支持(IDEA打開):
上面的代碼是我自己以前寫著玩的某一個項目的部分代碼(寫的挺爛),不過可見Java里這種切分與組合還是很重要的!
45.注意下面的語句:
list1 = ["1", "2"] list2 = list1 del list1[-1] print(list2)可見:這里是淺復制!!這里是比較深的知識,在Java里深拷貝也是比較有趣的知識,建議感興趣的讀者了解一下。
淺復制可以簡單地解釋為:這兩個對象指向同一塊內存空間,一個改變則全都改變。
46.Python里面,切片等操作也不能索引越界,否則會爆出IndexError(只不過Python允許負數索引,即“倒著找”)。
Java則是IndexOutOfBoundsException那種異常。
47.Python一些分析string內部字符后返回True/False的方法:
| str1.isdigit() | str1的所有字符都是數字 |
| str1.isalpha() | str1的所有字符都是字母 |
| str1.isalnum() | str1的所有字符都是字母或者數字 |
| str1.islower() | str1的所有字符都是小寫字母 |
| str1.isupper() | str1的所有字符都是大寫字母 |
| str1.isspace() | str1的所有字符都是空白字符 |
48.Python也有判斷類型的函數isinstance():
isinstance(item, dataType)返回布爾類型。
49.簡化表達式條件:
case 1:
(state == "A") or (state == "B") or (state == "C") or (state == "D")可以簡化為:
state in ["A", "B", "C", "D"]case 2:
(x > 10) and (x <= 20)可以簡化成:
10 < x <= 20case 3:
(x >= 20) or (x <= 10)可以利用德.摩根律轉換為:
not(10 < x < 20)50.Python的集合(Set)的重要方法:
- add():增
- discard():刪
- clear():清空
還有這樣的方法
set([…]) / set((…))可以將列表或者元組轉換成無序集合
Python還支持集合論的基本操作(交/并/差)等:
- set1.union(set2):并集
- set1.intersection(set2):交集
- set1.difference(set2):差集
51.Python模塊導入的五種類型
- 導入整個模塊文件:import module_name
- 只導入指定函數:from module_name import function_name
- 使用as指定函數別名:from module_name import function_name as another_name
- 使用as指定模塊別名:import module_name as another_name
- 導入所有函數:from module_name import *
52.Python列表操作的時間復雜度
| 索引 | O(1) |
| 索引賦值 | O(1) |
| 追加 | O(1) |
| pop() | O(1) |
| pop(i) | O(n) |
| insert(i, item) | O(n) |
| 刪除 | O(n) |
| 遍歷 | O(n) |
| 包含 | O(n) |
| 切片 | O(k) |
| 刪除切片 | O(n) |
| 設置切片 | O(n+k) |
| 反轉 | O(n) |
| 連接 | O(k) |
| 排序 | O(nlogn) |
| 乘法 | O(nk) |
53.Python字典操作的時間復雜度
| 復制 | O(n) |
| 取值 | O(1) |
| 賦值 | O(1) |
| 刪除 | O(1) |
| 包含 | O(1) |
| 遍歷 | O(n) |
54.Python中類的專有方法
- __init__:構造方法,在生成對象時調用
- __del__:析構函數,在釋放對象時調用
- __repr__:打印,轉換
- __setitem__:按照索引賦值
- __getitem__:按照索引獲取值
- __len__:獲得長度
- __cmp__:比較運算
- __call__:函數調用
- __add__:加運算
- __sub__:減運算
- __mul__:乘運算
- __div__:除運算
- __mod__:求余運算
- __pow__:乘方運算
總結
以上是生活随笔為你收集整理的【Python】Python一些有趣而基础的知识(结合Java进行对比)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面向对象】面向对象程序设计测试题9-对
- 下一篇: 【Python】Numpy中对向量、矩阵