-
is
is 判斷兩個(gè)標(biāo)識(shí)符是否引用同一個(gè)對(duì)象,x is y 類似 id(x)==id(y)
is not 判斷兩個(gè)標(biāo)識(shí)符是否引用不同對(duì)象,x is not y 類似 id(x)!=id(y)
is 和 == 區(qū)別:
is 判斷兩個(gè)標(biāo)識(shí)符是否引用同一個(gè)對(duì)象
== 判斷引用變量的值是否相等
針對(duì)None進(jìn)行比較時(shí),建議使用is
- for & while
names = ['Naruto', 'Luffy', 'Conan', 'Sasuke']
for name in names:
print(name)
else:
print("沒(méi)有通過(guò)break退出循環(huán),循環(huán)結(jié)束后,會(huì)執(zhí)行的代碼")
index = 0
while index < len(names):
print(names[index])
index += 1
- 函數(shù)
- 多個(gè)返回值
# 多個(gè)返回值,其實(shí)就是一個(gè)tuple
def move(x, y, step, angle=0):
# 一個(gè)點(diǎn)移動(dòng)到另一個(gè)點(diǎn),給出坐標(biāo)、位移和角度,就可以計(jì)算出新的新的坐標(biāo)
# angle=0 表示默認(rèn)參數(shù)
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
# 可以使用多個(gè)變量一次接收所有返回值
x, y = move(100, 100, 60, math.pi / 6)
print(x, y) # 151.96152422706632 70.0
# 可以用一個(gè)元組接收多個(gè)返回值
z = move(100, 100, 60, math.pi / 6)
print(z) # (151.96152422706632, 70.0)
交換兩個(gè)變量的值:
def change(a, b):
# 利用元組
a, b = b, a
return a, b
- 缺省參數(shù)
# 缺省參數(shù)必須指向不變對(duì)象,缺省參數(shù)放在最后
def enroll(name, gender, age=6, city='Beijing'):
print('name:', name, ' gender:', gender, ' age:', age, ' city:', city)
enroll('xiaolan', 'A', 7, 'shenzhen')
enroll('xiaobai', 'F')
enroll('xiaohei', 'B', 5)
enroll('xiaofen', 'C', city='shanghai') # 不是按順序輸入,需要寫(xiě)上參數(shù)名
- 多值參數(shù)(知道)
'''
參數(shù)名前增加一個(gè)* 可以接收元組,命名規(guī)則:*args
參數(shù)名前增加兩個(gè)* 可以接收字典,命名規(guī)則:**kwargs
'''
def calc(*args):
sum = 0
for n in args:
sum = sum + n * n
return sum
print(calc(1, 2, 3))
# *nums表示把nums這個(gè)list的所有元素作為可變參數(shù)傳進(jìn)去
nums = [1, 2, 3]
print(calc(*nums))
print('=' * 50)
def person(name, age, **kwargs):
print('name:', name, 'age:', age, 'other:', kwargs)
person('Michael', 30) # name: Michael age: 30 other: {}
person('Bob', 35, city='Beijing') # name: Bob age: 35 other: {'city': 'Beijing'}
person('Adam', 45, gender='M', job='Engineer') # name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra) # name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
print('=' * 50)
# 如果要限制關(guān)鍵字參數(shù)的名字,就可以用命名關(guān)鍵字參數(shù),例如,只接收city和job作為關(guān)鍵字參數(shù)
def person3(name, age, *, city, job):
print(name, age, city, job)
# 命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名,這和位置參數(shù)不同。如果沒(méi)有傳入?yún)?shù)名,調(diào)用將報(bào)錯(cuò):
person3('Jack', 24, city='Beijing', job='Engineer')
# 參數(shù)定義的順序必須是:必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。
- 遞歸函數(shù)
# n! = 1 x 2 x 3 x ... x n
def fact(n):
if n == 1:
return 1
return n * fact(n - 1)
print(fact(5))
尾遞歸
尾遞歸是指,在函數(shù)返回的時(shí)候,調(diào)用自身本身,并且,return語(yǔ)句不能包含表達(dá)式。
編譯器或者解釋器就可以把尾遞歸做優(yōu)化,使遞歸本身無(wú)論調(diào)用多少次,都只占用一個(gè)棧幀,不會(huì)出現(xiàn)棧溢出的情況。
def fact_iter(num, result=1):
if num == 1:
return result
return fact_iter(num - 1, num * result)
fact_iter(5)
- 私有函數(shù)
# _xxx和__xxx這樣的函數(shù)或變量就是非公開(kāi)的(private),不應(yīng)該被直接引用
def __private__(name):
return 'Hello, %s' % name
print(__private__("xiaoli"))
# 查看對(duì)象內(nèi)的所有屬性和方法
print(list.__dir__())
注:
在函數(shù)內(nèi)部針對(duì)參數(shù)使用賦值語(yǔ)句,會(huì)在函數(shù)內(nèi)部修改局部變量的引用,不會(huì)影響外部變量的引用;
如果傳遞的參數(shù)是可變類型,在函數(shù)內(nèi)部,使用方法修改變量?jī)?nèi)容,同樣會(huì)影響外部變量。
L = ['Hello', 'World', 'IBM', 'Apple']
list = [s.lower() for s in L]
print(list) # ['hello', 'world', 'ibm', 'apple']
- list
# list里面的元素的數(shù)據(jù)類型也可以不同
list = ["hahah", 1, ['a','d'], True]
name_list = ["鳴人", "佐助", "小櫻"]
print(name_list)
for name in name_list:
print(name)
n = 0
while n < len(name_list):
print(name_list[n])
n += 1
# list長(zhǎng)度
print("列表中包含%d個(gè)元素" % len(name_list)) # 3
# list中某個(gè)元素有幾個(gè)
count = name_list.count("鳴人")
# 往list中追加元素到末尾
name_list.append("卡卡西")
# 元素插入到指定的位置
name_list.insert(1, "佐井")
# 將一個(gè)列表中元素增加到另一個(gè)列表中
list1 = ["豬八戒", "孫悟空"]
name_list.extend(list1)
# 把某個(gè)元素替換成別的元素
name_list[0] = "漩渦鳴人"
# 獲取元素下標(biāo),如果元素不在列表中,會(huì)報(bào)錯(cuò)
print(name_list.index("小櫻"))
# 刪除list末尾的元素
name_list.pop()
# 刪除指定位置的元素
name_list.pop(1)
# 刪除指定元素,數(shù)據(jù)不存在會(huì)報(bào)錯(cuò)
name_list.remove("豬八戒")
print(name_list)
# 清空列表中的元素
name_list.clear()
# 擴(kuò)展:刪除列表中指定下標(biāo)元素 可以用del
list2 = ["aaa", "bbb", "ccc"]
del list2[0]
# del也可以將變量從內(nèi)存中刪除
# a = "aaa"
# del a
# 排序
list3 = ["zhangsan", "lisi", "wangwu"]
list3.sort() # 升序排列
list3.sort(reverse=True) # 降序排列
# 逆序(反轉(zhuǎn))
list3.reverse()
# 列表相加 +=相當(dāng)于調(diào)用extend()方法
list1 = [1, 2, 3]
list2 = [4, 5]
list3 = list1 + list2
print(list3) # [1, 2, 3, 4, 5]
print(list3 * 2)
- tuple
my_info_tuple = ("路飛", 17, "船長(zhǎng)")
print(my_info_tuple[1])
print(my_info_tuple.index("船長(zhǎng)"))
# 某個(gè)元素在tuple中出現(xiàn)的次數(shù)
count = my_info_tuple.count("路飛"))
len = len(my_info_tuple))
for name in my_info_tuple:
print(name)
# 元組和列表的轉(zhuǎn)換
list1 = ["豬八戒", "孫悟空", "沙和尚"]
tuple1 = ("柯南", "路飛", "鳴人")
# 元組轉(zhuǎn)列表
list2 = list(tuple1)
# 列表轉(zhuǎn)元組
tuple2 = tuple(list1)
# 只有一個(gè)元素的元組
tuple = (1,)
# 元組相加
tuple1 = (1, 2, 3)
tuple2 = (4, 5)
tuple3 = tuple1 + tuple2
- dictionary
student_dic = {"name": "小明", "age": 10, "score": 67.2}
# 取值 key不存在返回None
print(student_dic.get("nnn"))
# key不存在返回指定value
print(student_dic.get("nnn", -1))
# student_dic["key"],key不存在會(huì)報(bào)錯(cuò),in判斷的是key
if "nnn" in student_dic:
print(student_dic["nnn"])
else:
print("key不存在")
# 刪除元素
student_dic.pop("age")
# 增加、修改元素
student_dic["height"] = 155
# 統(tǒng)計(jì)鍵值對(duì)數(shù)量
len = len(student_dic))
# 合并字典, 如果被合并的字典中包含已經(jīng)存在的鍵值對(duì),會(huì)覆蓋原有鍵值對(duì)
dic1 = {"key1": "value1"}
dic2 = {"key2": "value2", "key1": "value3"}
dic1.update(dic2)
# 清空字典
dic1.clear()
# 循環(huán)遍歷
for key in student_dic.keys():
print("key =", key)
for value in student_dic.values():
print("value =", value)
for key, value in student_dic.items():
print("key =", key, ", value =", value)
- String
word = '字符串'
sentence = "這是一個(gè)句子。"
paragraph = """這是一個(gè)段落,
可以由多行組成"""
str = 'Runoob'
print(str[0:-1]) # 下標(biāo)為0的字符到倒數(shù)第二個(gè)字符
print(str[0]) # 下標(biāo)為0的字符
print(str[2:4]) # 下標(biāo)為2的字符到下標(biāo)為4之前的字符
print(str[2:]) # 下標(biāo)2開(kāi)始的后的所有字符
print(str * 2) # 輸出字符串兩次
print(str + "TEST") # 連接字符串
print(str[-1:]) # -1表示最后一個(gè)字符
# 使用反斜杠()轉(zhuǎn)義特殊字符,如果你不想讓反斜杠發(fā)生轉(zhuǎn)義,可以在字符串前面添加一個(gè) r,表示原始字符串
print('Ru\noob')
print(r'Ru\noob')
string = "asdfogoakmold"
# 字符串string長(zhǎng)度
len = len(string))
# string中字符串"o"的個(gè)數(shù)
count = string.count("o")
# 字符串string中是否包含字符串“a”,返回string中第一個(gè)“a”所在下標(biāo),不存在返回-1
index = string.find("a")
index = string.rfind("a") # 從右往左查找
# 返回字符串string中字符串“a“所在下標(biāo),不存在報(bào)異常
index = string.index("a")
index = string.rindex("a") # 從右往左查找
# 將string中的"old"用"new"替換,原字符串不會(huì)改變,返回新的字符串
string.replace("old", "new")
string.replace("old", "new", 1) # 只替換第一個(gè)"old"字符串
# 判斷字符串string是否以"a"開(kāi)頭
string.startswith("a")
# 判斷字符串string是否以"s"結(jié)尾
string.endswith("s")
# 將字符串string轉(zhuǎn)為小寫(xiě)
string.lower()
# 將字符串string轉(zhuǎn)為大寫(xiě)
string.upper()
# 去掉字符串左邊空格
string.lstrip()
# 去掉字符串右邊空格
string.rstrip()
# 去掉字符串兩邊空格
string.strip()
width = 20
# 返回原字符串左對(duì)齊,并且使用空格填充至長(zhǎng)度的width的新字符串
string.ljust(width)
# 返回原字符串右對(duì)齊,并且使用空格填充至長(zhǎng)度的width的新字符串
string.rjust(width)
# 返回原字符串居中,并且使用空格填充至長(zhǎng)度的width的新字符串
string.center(width)
# 將字符串按照某個(gè)字符串進(jìn)行分割,split()方法不傳任何參數(shù)時(shí),則按照任意空白字符分割
string = "er ewe dsdsf fdsfs"
string.split(" ") # ['er', 'ewe', 'dsdsf', 'fdsfs']
# 將字符串string以"str"分割為三部分,str前、str、str后,以第一個(gè)"str"為準(zhǔn)
string.partition("str")
string.rpartition("str") # 從右邊起
# 字符串按 “\n”切割
string.splitlines()
# 字符串中是否都是數(shù)字,都不能判斷小數(shù)
string.isdecimal() # 全角數(shù)字,盡量使用這個(gè)方法
string.isdigit() # 全角數(shù)字、"(1)"、\u00b2(unicode字符串)
string.isnumeric() # 全角數(shù)字、漢字?jǐn)?shù)字
# 字符串中是否都是字母
string.isalpha()
# 字符串中是否只有數(shù)字和字母
string.isalnum()
# 字符串中只包含空格
string.isspace()
# string每一個(gè)字符后插入字符串sss,構(gòu)造新的字符串
sss = "xxx"
sss.join(string) # axxxbxxxcxxx1xxx2xxx3
# 字符串的切片,切片同樣適用于list和tuple
# str[索引:索引:步長(zhǎng)]
str = "0123456789"
str1 = str[0:5] # 01234
# 從下標(biāo)為0的字符開(kāi)始,到下標(biāo)為8的字符之前(左閉右開(kāi)),每隔三個(gè)字符取一個(gè)
str2 = str[0:8:3] # 036
# -1表示從右向左切
print(str[-1::-1]) # 9876543210
print(str[::-1]) # 9876543210
-
變量
在開(kāi)發(fā)時(shí),應(yīng)該把模塊中的全局變量定義在所有函數(shù)的上方
全局變量名應(yīng)加 g_ 或 gl_ 前綴
gl_name = "唐僧"
# 函數(shù)內(nèi)部修改全局變量
def test():
# global關(guān)鍵字表示后面的變量是一個(gè)全局變量,再使用賦值語(yǔ)句時(shí),就不會(huì)創(chuàng)建局部變量
global gl_name
gl_name = "悟空"
print(gl_name)
- 三元運(yùn)算符
# a b c最大值
max = a if a > b else b
max = max if max > c else c
-
range()
range() 生成一個(gè)自然數(shù)序列
通過(guò)range()可以創(chuàng)建一個(gè)執(zhí)行指定次數(shù)的for循環(huán)
# 生成[0,1,2,3,4]
range(0,5)
# 執(zhí)行10次
for i in range(10):
print(i)