python进阶
主要内容:
1、 自定义函数
def mysum(a,b,c):
print('a+b+c = %d'%(a+b+c))
print(mysum(2,3,34))
1.1 函数定义
def myAbs(data):
#参数检查
if not isinstance(data,(int,float)):
raise TypeError('您输入的数据类型错误,请输入整数或浮点数!')
if data < 0 :
return -data
else:
return data
myAbs(0)
1.2 函数的参数检查
data = input('请输入一个数值:')
abs(data) #出错,data读入的是一个str类型
abs(int(data))
1.3 自定义函数的参数(注意顺序)
python中的参数(有顺序):必填参数(位置参数)、默认参数、可变参数、命名关键字参数、关键字参数
①必填参数
def myPower(x,n): #x, n 为必填参数
return x**n
myPower(2,5)
②默认值参数
def myPower(x,n=2): #n为默认值参数,可不填
return x**n
③可变参数
def stuAvg(*info): #info为可变参数
return sum(info)/len(info)
stuAvg(75,65,100,98,97,56,74)
stuScores = [75,65,100,98,97,56,74]
stuAvg(*stuScores) #可变数据需要加星号
④命名关键字参数
def person(name,sex='male',*,city,email):
#星号的作用:命名关键字参数需要一个可变参数占位,让解释器明白后面的参数是命名关键字
return '你的姓名:{}, 性别:{},城市:{},电子邮件:{}'.format(name,sex,city,email)
person('zhang',city='chongqing',email='zhang@163.com')
person('zhang','',city='chongqing',email='zhang@163.com')
⑤关键字参数
返回和接受的类型:字典 dict
def person(**other):
# return '姓名:{name},性别:{sex}年龄:{age}'.format(other)
return '姓名:{0},年龄:{2},性别:{1}'.format(other['name'],other['sex'],other['age'])
person() #dict类型
dictInfo = {'name':'zhang','sex':'male','age':22}
person(**dictInfo)
只取值的写法
def dataSave(**userInfo):
return userInfo.values()
dictInfo = {'name':'zhang','sex':'male','age':22}
dataSave(**dictInfo)
1.4 递归函数
应用场景距离:游戏场景切换
计算阶乘 x=1*2*3*4*5*…*n
- 表示函数:fact(x)→→→ x*fact(x-1)
def fact(x):
if x ==1:
return 1
return x*fact(x-1)
fact(5)
5*4*fact(3)
2、 iterable 可迭代对象
from collections import Iterable
def dataClien(data):
if isinstance(data,Iterable):
sum = 0
for i in data:
sum += i
return '合计金额为:{}'.format(sum)
else:
return '合计金额为:{}'.format(data)
dataClien(100)
dataClien([100,200,43,35556])
isinstance(100,Iterable) #false
isinstance([100,200,43,35556],Iterable) #true
isinstance('hello',Iterable)
isinstance(True,Iterable)
3、 enumerate()
将list变成‘索引-元素对’
dozie = ['shu','niu','ma','hou']
for i,v in enumerate(dozie,3): #可以设置索引起始值
print(i,v,sep='==>')
4、 列表生成式(列表解析,列表推导)
简单逻辑,不适用于太多层嵌套的循环
list(range(3,13,3))
lst = []
for i in range(1,13):
if i%3 == 0:
lst.append(i*i)
lst
改写成列表解析方式:
lst1 = [x*x for x in range(1,13) if x%3==0]
lst1
例子:
data = [x+y for x in 'abc' for y in 'XYZ' if x == 'a']
data
例子:读取磁盘目录
import os
my_dir = [d for d in os.listdir('d:/')]
my_dir
5、 生成器
一边循环一边计算,计算完成就结束
g = (x*x for x in range(10))
g
next(g)
for i in g:
print(i)
例子:斐波拉契数列:
常规写法:
def fib(max):
n,a,b = 0,0,1
while n < max:
print(b)
a,b = b, a+b
n +=1
fib(12)
yield关键字,产生生成器:
def fib(max):
n,a,b = 0,0,1
while n < max:
yield b
a,b = b, a+b
n +=1
fib(12)
for i in fib(12):
print(i)
6、 迭代器
集合数据类型(list/tuple/dict/set/str)
generator(生成器对象,带yield的generator function)
Iterable(可迭代对象,直接作用于for循环的对象)
Iterator(迭代器,可被next()函数调用,并不断返回下一个数据)
好处:实时保存,减少数据丢失
迭代器与可迭代对象的区别
#都是可迭代对象
test1 = [x*x for x in range(1,6)] #不可以用next(),不是迭代器
test2 = (x*x for x in range(1,6)) #能用next(),是迭代器
next(test1) #报错,列表不是迭代器
next(test2)
列表生成的也不是迭代器
from collections import Iterator
isinstance([X*X for X in range(5)],Iterator)
isinstance(fib(12),Iterator)
type(fib(12))
不过,可以转换成迭代器:
test1 = iter([x*x for x in range(1,6)])
next(test1)
- python装饰器(引用自软件工程)————封装 深入学习
- python支持多继承 Java C#是单继承多接口