文章目录
print(‘欢迎大家’)
print(‘学习’)
print(‘python人工智能’)
- 3行代码不能重复改造成为一个模块,现在我们这样才可以将3行代码放到一个代码块里(函数块里)
一、函数
1.定义函数:
-
定义函数的语法格式 def 函数名称 def表示的是函数的关键字
-
操作函数: 给函数赋值、定义变量常量等
-
调用函数 必须
作用:可一件代码重复使用,必须很大大量的重复代码实现,并且利用函数代码容易维护!
可以讲解软件之间的耦合度—解耦性def Num(): print('欢迎大家') print('学习') print('python人工智能')
2.调用函数
Num()
-
任何传入参数和自变量必须放在圆括号中
def Num1(a):# 给函数Num里面传递一个参数 print('a的值为:',a)
#调用函数Num1
Num1(100)# 通过函数给a进行赋值
- 备注:函数可以给变量等赋值,!这样的操作效率高
- 函数的第一行可以选择性的使用文档字符串—用于存放函数说明
注释:此函数是项目里面用于求和的功能函数 ()-----工作里必须指明函数的功能
def sun(a,b):
print('a的w值为',a)
print('b的w值为', b)
#通过函数名称给函数变量 a 和 b赋值
#sum(100,200)
-
备注:通过以上函数发现,函数可以带多个参数
-
可以给函数起个别名
-
此操作需要全局变量 和 局部变量的辅助
def Num3(a): pri = Num3(a)#表示的是将函数Num3给一个变量pri print(pri) Num3(1000)
‘’’
函数的参数类型:实参和形参
‘’’
def PName(username): # uesrname是形参 形参指的是一个不确定的参数的简称–动态形参
print(‘姓名是:’,username)
PName(‘李连杰’) # 实参 实参是给形参赋值的操作
总结: 有形参必须有实参 如果有形参,没实参 程序会报空指针
3.函数的参数
- 必备参数(位置实参)
- 关键字参数
- 默认参数
- 必定长参数
(1)必备参数(位置实参)
def Num5(a=10,b=20,c=100): #a,b,c是形参
print('a的值为:',a)
print('b的值为:',b)
print('c的值为:',c)
Num5(1,2,3)#1 2 3 是实参
- 位置参数就是实参和形参一一对应
(2)关键字参数
def Num6(pet1,pet2):
print('pet1的值为',pet1)
print('pet2的值为', pet2)
Num6(pet2 = '黄毛',pet1 = '黑毛')
- 发现在函数调用处,没有按照形参的顺序赋值!把参数名pet1和pet2作为关键字,交给函数进行赋值匹配—匹配操作交给解释器执行!
(3)默认参数
def anaiml(pet2,pet1='dog',pet3='lion'): #此行代码已经给pet1进行赋值
print('pet2的值为:',pet2)
print('pet1的值为:', pet1)
anaiml('teger')
anaiml('teger','mouse') # 实参可以传递任意类型的对象
-
备注;解释器不会去检查实参的类型
#通过pet1的赋值,其实是将pet2的值给指定了一个位置或具体的值,这个值就称为函数参数的默认值!
#但此操作不建议使用,因为在Python计数器解释的时候会将实参和形参很难区分
‘’’
函数的:不定长参数
1:为什么利用不定长参数?
效率高,经常会用到
‘’’def getUsername(name,address,*zhh): # * 表示的是一个通配符,表示的是函数里面可以有多个不确定个数的形式参数 print('用户的姓名是:',name) print('用户的家庭住址:',address) print('*zhh的数据类型是:',type(zhh)) print(*zhh) getUsername('刘德华','九龙',12,'c')
-
不定长参数的数据类型是元祖—元祖的特性:(‘12’,‘412’)
-
一个*其实就是表示的是内存,----内存是谁开辟—元祖(元祖就是存放数据的集合)
def getUsername(name,address,*zhh,**zheng): print('用户的姓名是:',name) print('用户的家庭住址:',address) print('*zhh的数据类型是:',type(zhh)) print('*zheng的数据类型是:', type(zheng)) print(zhh) print(zheng) getUsername('刘德华','九龙',12,age=12,data=1997,)
-
两个** 在不定长参数里数据类型为 字典
-
备注: ** 表示的是可以直接在函数调用处给函数直接赋值、并且直接定义实参,不需要在函数里定义形式参数,效率高!
-
在python中,strings,tuples,numbers是不可更改的对象,而list,dict,set等则是可以修改的对象
def fun(agrs): agrs= '范冰冰' print(agrs) #变量的具体值 # 1 定义一个不可以改变----字符串 str1 = 'hello' # 2 将这个字符串传递到fun()里 fun(str1) # 3 判断是否改变 print('str1的字符串的值为',str1) fun(12)
-
说明:先执行函数里面的的参数值 agrs=’’ 如果有和函数匹配的值,那么打印输出,将抛弃函数定义的值
-
备注:在可变对象操作里面,利用args[0]=‘hello’ 小标重新赋值! 再交给函数调用去调用执行
4.函数的返回值
重点内容:函数的返回值
print(‘hello’) #不属于返回值,只是属于打印输出
title: 比较2个数的大小
def zhh(x,y):
if x>y:
print(x)
return x
else:
print(y)
return y
print(zhh(12,15))
#调用函数 并且给函数里的形参赋值
return 和 print()区别
-
'return’表示的是返回客户端浏览器的一行数据
-
print()表示的是只给客户端控制台打印输出结果,并非数据
-
return返回的永远是一个程序所控制的一个数据结果集
-
print()没有什么程序价值
-
return 以后的代码不再执行,—目前无法解决
def sum1(a,b): print(a) print(b) print(id(a)) print(id(b)) return a+b sum1(10,20)
-
备注:在python里面return返回值的id地址可以是同一个!(当满足变量的值相同的时候,变量名称可以不同,这样的目的是节约空间 )
-
python里面的return可以返回海量的数据,但java不行
def many(x,y): return x,y sum = many(12,24) sum2 = many(100,200) #用一个变量接收多个值,保存到元祖里 print(sum)
-
备注:return一次性可以返回多个值,保存到元祖里!不建议使用!
def returnmany(x,y,z): return x,y,z sum3,sum4,sum5=returnmany(12,100,200) print(sum5) print(sum4) print(sum3)
#以上操作针对于数据量少的时候,建议使用,因为他满足位置参数的时候,数据一一对应关系!
5.yield生成器
ef getNumber(n):
i=0
while i<=n:
print('i的值为:',i)
# return i #i执行完以后,结束程序不再进行
i+=1
yield i #表示的是将i或者一个变量看作生成器generator
#调用函数给n赋值,进行i>n的操作
print(getNumber(5))#打印输出
a = getNumber(5)#将一个函数值给一个变量a
#调用next()方法将生成器里的值按照由标的原理 ’一行一行读取‘
print(next(a)) #1次
print(next(a)) #2次
print(next(a)) #3次
print(next(a)) #4次
-
重点:yield生成器的next方法可以返回多个值。 在Python里此方法返回多个值,独一无二的!
-
yield 的核心就是利用next 方法 和iter()----不建议使用,没有next方法高效
-
因为上面这两个方法 最后都是返回一个**‘迭代器’对象**,next方法更接近于迭代器的迭代原理
-
yield 生成器for while 循环结合使用
getNumber(5) a1 = (1,2,3,4,5)# 可以元祖 集合set 列表 字段 it = iter(a1) print(next(it))#通过next方法打印输出** print(next(it))#通过next方法打印输出**
迭代器的作用和特性
- 通过iter()方法将数据从内存里面获取到!—获取到数据之后交给 next 方法去执行遍历结果集
- 总结:现有iter()方法,再有next方法, iter()方法和内存数据有关系! next()方法和内存数据没关系
- 所以通过next方法操作数据是安全的
- 迭代器有start开始 ----必须有end结束! 中途不能中断
6.全局变量&局部变量
def test1():
a = 100
print('a的值为:',a)
print('a的内存地址:',id(a))
def test2(): #在test2中访问test1的常量a?
a = 10
print('test2的id',id(a))
print('调用a',a) #test2的访问不了
test1()
test2()
- 局部变量只能在自己定义的函数体里访问,不能通过第二个函数直接访问
- 变量名称不一样—地址一样 地址不一样—变量名称一样