函数的参数
- 在Python中,函数的参数可以有默认值,也支持使用可变参数
- 在不确定参数个数的时候,我们可以使用可变参数,在参数名前面的*表示args是一个可变 参数
- global是全局变量,尽量不要使用
eg1:
#定义有可变参数的函数
def add (*args):
a = 0
for i in args:
a += i
return a
#对0个参数进行加法运算
print(add())
运行结果:
0
#对多个参数进行加法运算
print(add(2,3,1))
运行结果:
6
- 定义一个有可选参数的函数,直接在函数定义中给参数指定一个默认值,并放到参数列表最后
- 若设定了默认值,在调用函数的时候如果没有传入对应参数的值时将使用该参数的默认值
eg2:
#定义有默认参数的函数
def A (a,b,c=99):
print(a,b,c)
#调用函数
A(1,2)
运行结果:
1 2 99
#调用函数
A(2,3,4)
运行结果:
2 3 4
用模块管理函数
- 若同一个.py文件中定义了两个同名函数,则需要用模块管理函数
eg3:module1.py
def Tom():
print("eating")
module2.py
def Tom():
print("sleeping")
test.py
from module1 import Tom
# 输出eating
Tom()
from module2 import Tom
# 输出sleeping
Tom()
- 如果test.py同时调用两个Tom,则会输出后边的哪一个,后边的会覆盖前边的
- name 是Python中一个隐含的变量它代表了模块的名字
- 只有被Python解释器直接执行的模块的名字才是__main__
module3.py
eg4:
def Arc()
def Bte()
if __name__ == '__main__':
print('call Arc()')
Arc()
print('call Bte()')
Bte()
- 导入则不会执行模块中if条件成立时的代码 因为模块的名字是module3而不是__main__
test.py
import module3
使用字符串
字符串的标志:" "
def main():
str1 = "tell me why 007"
#通过len函数计算字符串的长度
print(len(str1))
main() #15
#capitalize获得字符串首字母大写的拷贝
print(str1.capitalize())
main() #Tell me why 007!
# upper获得字符串变大写后的拷贝
print(str1.upper())
main() #TELL ME WHY 007
# find从字符串中查找子串所在位置
print(str1.find('wh')) # 8
print(str1.find('llt')) # -1
main() #8 -1
# index与find类似但找不到子串时会引发异常
print(str1.index('wh'))
print(str1.index('llt'))
main() # 8 报错
# startswith检查字符串是否以指定的字符串开头
print(str1.startswith('tell')) # False
print(str1.startswith('0')) # True
main() #True False
# endswith检查字符串是否以指定的字符串结尾
print(str1.endswith('tell'))
main() #False
# center将字符串以指定的宽度居中并在两侧填充指定的字符
print(str1.center(50, '*'))
main() #*****************tell me why 007******************
# rjust将字符串以指定的宽度靠右放置左侧填充指定的字符
print(str1.rjust(50, ' '))
main() #***********************************tell me why 007
# 从字符串中取出指定位置的字符(下标运算)
print(str1[6])
main() #e
# [:]字符串切片(从指定的开始索引到指定的结束索引)
print(str1[2:5]) # ll
print(str1[2:]) # ll me why 007
print(str1[2::2]) # l ewy07
print(str1[::2]) # tl ewy07
print(str1[::-1]) # 700 yhw em llet
print(str1[-3:-1]) # 00
main()
# isdigit检查字符串是否由数字构成
print(str1.isdigit())
main() # False
# isalpha检查字符串是否以字母构成
print(str1.isalpha())
main() # False
# isalnum检查字符串是否以数字和字母构成
print(str1.isalnum())
main()# False
# strip获得字符串修剪左右两侧空格的拷贝
def main():
str2 = " tell me why 007 "
print(str2.strip())
main() #tell me why 007
列表
- 字符串的标志:[]
- 可使用列表对列表元素进行访问、添加和删除等操作
def main():
list1 = [1, 9, 5, 7, 3,999]
print(list1)#[1, 9, 5, 7, 3, 999]
list2 = ['hello'] * 5
print(list2)#['hello', 'hello', 'hello', 'hello', 'hello']
# len计算列表长度(元素个数)
print(len(list1))
main()#6
# []下标(索引)运算
print(list1[0])
main()#1
# append、insert添加元素
list1.append(333)
list1.insert(0, 400)
list1 += [1999, 2999]
print(list1)
print(len(list1))
main()#[400, 1, 9, 5, 7, 3, 999, 333, 1999, 2999] 10
#用append给a列表去重
a = [1,1,2,3,1,4,5,3,1,6,6]
b = []
for i in a:
if i not in b:
b.append(i)
print(b)#[1, 2, 3, 4, 5, 6]
# remove删除元素
list1.remove(3)
print(list1)
main()#[1, 9, 5, 7, 999]
# clear清空列表元素
list1.clear()
print(list1)
main()#[]
- 列表也可做切片操作
def main():
class1 = ['wurongrong','wanxinxin','zhaozhao']
class1 += ['wenduidui','wencuocuo']
#循环遍历列表
for i in class1:
print(i)
main()#wurongrong
wanxinxin
zhaozhao
wenduidui
wencuocuo
# 列表切片
class2 = class1[1:4]
print(class2)#['wanxinxin', 'zhaozhao', 'wenduidui']
main()
# class2 = class1 # 没有复制列表只创建了新的引用
# 可以通过完整切片操作来复制列表
nclass1 = class1[:]
print(nclass1)
main()#['wurongrong', 'wanxinxin', 'zhaozhao', 'wenduidui', 'wencuocuo']
# 可以通过反向切片操作来获得倒转后的列表的拷贝
class_ = class1[::-1]
print(class_)
main()#['wencuocuo', 'wenduidui', 'zhaozhao', 'wanxinxin', 'wurongrong']
元组
- 元组与列表的相同之处:可以保存多条数据
- 元组与列表的不同之处:元组的元素不能修改
def main():
# 定义元组
t = ('蔡文姬', 13, True, '重庆火锅')
print(t)#('蔡文姬', 13, True, '重庆火锅')
# 获取元组中的元素
print(t[0])#蔡文姬
print(t[3])#重庆火锅
main()
# 遍历元组中的值
for member in t:
print(member)#蔡文姬
13
True
重庆火锅
# 重新给元组赋值
#t[3] = '九宫格火锅' # TypeError
# 变量t重新引用了新的元组原来的元组将被垃圾回收
t = ('九宫格火锅', 678, True, '超级辣')
print(t)#('九宫格火锅', 678, True, '超级辣')
main()
# 将元组转换成列表
person = list(t)
print(person)#['蔡文姬', 13, True, '重庆火锅']
# 列表是可以修改它的元素的
person[0] = 'ADC'
person[1] = '肌肉'
print(person)#['ADC', '肌肉', True, '重庆火锅']
# 将列表转换成元组
fruits_list = ['apple', 'banana', 'orange']
fruits_tuple = tuple(fruits_list)
print(fruits_tuple)
main()
集合
- 特性:确定性,互异性,无序性
- 可以进行交集、并集、差集等运算
def main():
set1 = {9, 888, 77, 9, 888, 77}
print(set1)#{888, 9, 77}
print('Length =', len(set1))#Length = 3
set2 = set(range(1, 10))
print(set2)#{1, 2, 3, 4, 5, 6, 7, 8, 9}
#add添加元素
set1.add(4)
#update添加元素
set2.update([11, 12])
print(set1)#{888, 9, 4, 77}
print(set2)#{1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12}
# remove的元素如果不存在会引发KeyError
if 4 in set2:
set2.remove(4)
print(set2)#{1, 2, 3, 5, 6, 7, 8, 9, 11, 12}
# 遍历集合容器
for elem in set2:
print(elem ** 2, end=' ')
print()#1 4 9 25 36 49 64 81 121 144
# 集合的交集、并集、差集、对称差运算
print(set1 & set2)
# print(set1.intersection(set2))#{9}
print(set1 | set2)
# print(set1.union(set2))#{1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 77, 888}
print(set1 - set2)
# print(set1.difference(set2))#{888, 4, 77}
print(set1 ^ set2)
# print(set1.symmetric_difference(set2))#{1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 77, 888}
# 判断子集
print(set2 <= set1)
# print(set2.issubset(set1))#False
main()
字典
- 格式:dict = {key:value}
- 字典是无序的,没有索引操作,除非转换成有序字典
def main():
scores = {'虞姬': 99, '孙尚香': 66, '鲁班': 22}
# 通过键可以获取字典中对应的值
print(scores['虞姬'])#99
# 对字典进行遍历(遍历的其实是键再通过键取对应的值)
for elem in scores:
print('%s\t--->\t%d' % (elem, scores[elem]))#虞姬 ---> 99
孙尚香 ---> 66
鲁班 ---> 22
# 更新字典中的元素
scores['虞姬'] = 123
scores.update(王昭君=67, 周瑜=89)
print(scores)#{'虞姬': 123, '孙尚香': 66, '鲁班': 22, '王昭君': 67, '周瑜': 89}
# get方法也是通过键获取对应的值但是可以设置默认值
print(scores.get('周瑜', 60))#89
# 删除字典中的元素
print(scores.popitem())#('周瑜', 89)
print(scores.pop('周瑜', 60))#60
# 清空字典
scores.clear()
print(scores)#{}
main()
匿名函数
- (lambda x,y:print(x,y))(100,10) 关键字lambda表示匿名函数,冒号前面的表示函数参数。
- 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
- 用匿名函数有个好处,因为函数没有名字,不用担心函数名冲突。匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数。