知识点6--函数
函数:
1 函数的引出:
函数概述:在一个完整的项目中(假设有大量代码),
会有大量需要重复使用的代码,
可以将这些重复的代码写成一个函数,
当我们重复使用的时候,直接调用就可以
本质:代码的封装
优点:1.极大的简化了代码,提高了复用性
2.当代码需要添加或者修改功能(bug)时,只需要去对应位置修改即可
格式:
def 函数名(参数1,参数2,....):
语句块
return 结果/表达式
1.定义一个函数需要用def关键字开始
2.函数名是给该函数取一个名(自定义),
函数名遵循标识符命名规则
3.函数名后面跟的是(),()中用来放参数列表
当参数列表为空时,()不可省略
4.参数列表可以有多个,也可以没有
参数列表中的参数是用来接收参数的
这些参数就是变化的量
5.()后需要跟上:,冒号表示函数体的开始
函数体需要用tab缩进来表示范围
6.语句块--就是需要重复使用的代码
7.return: 1 用来返回一个结果/表达式,返回的值是用来告诉调用者
2 return可以省略,省略就表示不需要返回结果,
注意:如果没有写return,默认会执行return None
3return可以用来终止函数,函数默认是函数体执行完后自动终止
例子:计算器
a = 1 其中a跟b是可变化的
b = 1
c = a + b
print(c)
def add(a,b):
c = a + b
return c
例子:def printFozu():
调用格式:
函数名(参数1,参数2,......)
1. 函数名是需要调用的函数的函数名(名字必须一致) printFozu add
2. 函数名后跟(),()中放置需要传递给定义函数的参数(实际参数) 1跟1
3.()可以是空参,即使是空参,()也不能省略
本质:实际参数赋值给形式参数的过程,形式参数指的a跟b
调用例子:
print Fozu()
print(add(2,3))
案例一:
简单的函数
注意:函数需要先定义再使用
需求:通过函数来打印一个语句
定义了函数是不执行的
printStr 出现在函数前面是报错的
def printStr():
print("wen is a nice man")
print("wen is a handsome man")
print("wen is a good man")
#假设第一次调用
printStr
#假设第n个地方调用
printStr()
三 函数的参数:
需求:定义一个函数用来输出姓名,年龄
定义函数的地方,参数名叫形式参数。只定义了函数的名字,没有具体值
调用的时候,实际参数赋值给形式参数的过程
相当于形式参数name = 实际参数name 同时 实际参数 = "死胖子"
def printNameAndAge(name,age):
print("%s的年龄是%d"%(name,age))#这里的name代表的是形式参数
调用
printNameAndAge("金三胖胖",32)
name = "死胖子"
age = 34
调用函数的位置,传入的参数叫实际参数
printNameAndAge(name,age)
注意:调用函数时,传入参数的个数需要与定义函数参数的个数一致
printNameAndAge("三胖子")显示报错缺一个参数
注意:调用函数时,传入参数的顺序需要与定义时一致,
printNameAndAge(78,"三胖子")#虽然不报错,会但顺序错乱
五 函数的返回值
需求:定义一个函数,求两个数的和
# 1.return会将一个结果返回,结果会作为调用者的返回值
2.return 可以不写,不写时默认执行return None,
3.return后也可以跟表达式,如果是表达式,会先执行表达式,
然后将表达式结果返回
4.注意:return可以用来终止函数的执行,
执行return后,后面的语句不会执行
def add(a,b):
c = a + b
return c
print("你已经成功计算出结果")
调用
res = add(100,101)
print(res)
例子:
for i in range(10):
print("哈哈",i) return可以用来终止函数,函数默认是函数体执行完后自动终止
return
6 函数的值传递问题
不可变类型,只改了上面,下面不改
def editNumber(number):
number = 90
print("number的值为:%d"%(number)) number的值为90
num = 100
editNumber(num)
#在看自己的成绩
print(num)
结果100
注意可变类型:一改全都改
def editNmaes(listName):
listName[0] = "马伊琍"
print(listName)
names = ["马蓉","马化腾","马赛克","马云","马克思"]
editNames(names)
print(names)
最后显示为:
["马伊琍","马化腾","马赛克","马云","马克思"]
["马伊琍","马化腾","马赛克","马云","马克思"]
7 函数的关键字
sorted(reverse=True)
需求:定义一个函数,打印姓名,年龄,爱好
def printPerson(name,age,likes):
print("name:%s"%(name))
print("age:%的"%"age")
print("likes:%s"%likes)
printPerson(age=18,name="马蓉"likes=["马赛克","马云","宋喆"])
printPerson(age=18,name="马蓉",["马赛克","马云","宋喆"])
printPerson(["马赛克","马云","宋喆"],age=18,name="马蓉",) #报错的
注意,关键字参数需要写在参数列表的后面,
非关键字参数需要写在所有关键字参数前
关键字参数的关键字名就是形式参数的变量名
printPerson("马蓉",likes=["马赛克","马云","宋喆"],age=18)
8 默认值参数
需求:打印某人的姓名,年龄,性别,爱好,身高
def printPerson(name,age,gender,likes,heigth):
print("name=%s,age=%d.gender=%s,heigth=%d"%(name,age,gender,heigth))
printPerson("金三胖胖",36,"不明"160)
printPerson("金三胖胖",36,160)
定义函数的时候可以在参数列表的后部给参数设置默认值
def printPerson(name,age,likes,heigth=179,gender="男"):
print("name=%s,age=%d.gender=%s,heigth=%d"%(name,age,gender,heigth))
printPerson("金三胖胖",36,"不明"160)
注意:在给函数传递参数的时候,默认值可以不传递
会自动的设置成默认值
如果设置了默认值,同时又传递了该参数,则实际传递的值优先级高
printPerson("金三胖胖",36,160)
9 不定长参数 重点
不定长参数: 一个参数表示多个值 一般用 *args
max(12,23,34,34,...)
需求:求多个数的和
#def addMoreNumber(num1,num2.........):
def addMoreNumber(*args):
print(args)
print(type(args)) 元组
for i in args:
print(i)
用*表示的变量,用来接收任意多个没有命名的变量,
会将这多个变量封装成元组,并传递到函数中
如果没有参数,会是一个空的元组
最好将可变长参数放在列表的后面
#调用
addMoreNumber()
addMoreNumber(12)
addMoreNumber(12,23)
addMoreNumber(12,3,4,56)
def addMoreNumber(name,*args):
print(args)
print(type(args)) 元组
print("name=%s"%(name))
for i in args:
print(i)
addMoreNumber(12,3,4,56,"name=胖胖胖")
addMoreNumber("胖胖",12,3,4,56)
# 完成 求任意多个数的和
def sum(*args):
count = 0
for i in args:
count += i
return count
print(sum(1,2,3,4))
def addMoreNumber(name,*args):
pass
用**表示的参数,用来接收任意多个有命名(key-value)的参数,
会自动将多个参数封装成字典,
参数名作为key,值作为value
如果没有命名的参数传递,则会生成空的字典
def func(**kwargs):
print(kwargs)
print(type(kwargs))
for key,value in kawargs.items()
测试
func()
func(age=10,name="小灰灰")
定义一个通用函数,关键字参数要放在后面
def function(*args,**kwargs):
pass
function(34,23,34,name="hello",age="18")#关键字参数要放在后面
9 匿名函数
了解
bind(函数名)
#def add(a,b):
# return a+b
lambda 表达式:
格式: lambda 形式参数1,形式参数2:结果表达式
#bind(lambda a,b:a+b)
add = lambda a,b:a+b
print(add(1,2))
10 偏函数
需求:将一个字符串数字转换为数字
print(int("10"))
将一个字符串表示的二进制数转换为十进制,默认使用的是十进制
print(int("10",base=2)) 1*2**0+0*2**1
2
print(int("1010",base=2)) 1*2**0+0*2**1+1*2**2+0*2**3
10
def int2(str)
return int(str,base=2)
print(int2("1010"))
print(int2"10")
import functools
偏函数,参数1为需要修改的函数名,参数2为需要设置的默认值
func = functools.partial(int,base=2) func相当于int
func("1010")
print(func("1010"))
一个py文件是一个模块,一个项目里有很多个py文件
12变量的作用域
作用域:变量的使用范围
注意:程序中的变量不是在任何地方都可以使用的
使用的范围是由定义的范围确定的
注意:在python中,只有模块,类,函数会引入新的作用域
while,for,elif,,if不会引入新的作用域
#number = 99
def editNumber():
#pass
number = 100
print(number)
number = 99
editNumber()
print(number)
在函数外面不能使用函数里面定义的变量
def editNumber():
num = 100 报错
print(num)
if True:
num=100
print(num)
if False:
num=100
print(num) 会报错
13 全局变量
num = 100
def editNum():
global num #申明num是全局变量
num = 99
print(num)
editNum()
print(num)
14异常处理
当程序遇到问题(异常)的时候,不直接结束程序(崩溃)
而让程序越过该错误,继续执行
格式1:
try:
可能出现异常的代码
except 异常类型 as e:
处理
try:
res = 5/0
print(res)
print(num)
except ZeroDivisionError as e:
print("ZeroDivisionError异常被抛出了")
except NameError as e
print("NameError异常被抛出了")
print("代码结束了")
注意:可以全部抛出, 抛出任何类型的异常
try:
res = 5/0
print(res)
print(num)
except:
print("抛出异常")#代表抛出任何类型的所有异常
print("代码结束了")
格式2
finally:无论程序是否出现异常,始终会执行该代码块
try:
count = 5/0
print(count)
except ZeroDivisionError as e:
print("ZeroDivisionError异常被抛出了")
finally:
代码块
函数:
1 函数的引出:
函数概述:在一个完整的项目中(假设有大量代码),
会有大量需要重复使用的代码,
可以将这些重复的代码写成一个函数,
当我们重复使用的时候,直接调用就可以
本质:代码的封装
优点:1.极大的简化了代码,提高了复用性
2.当代码需要添加或者修改功能(bug)时,只需要去对应位置修改即可
格式:
def 函数名(参数1,参数2,....):
语句块
return 结果/表达式
1.定义一个函数需要用def关键字开始
2.函数名是给该函数取一个名(自定义),
函数名遵循标识符命名规则
3.函数名后面跟的是(),()中用来放参数列表
当参数列表为空时,()不可省略
4.参数列表可以有多个,也可以没有
参数列表中的参数是用来接收参数的
这些参数就是变化的量
5.()后需要跟上:,冒号表示函数体的开始
函数体需要用tab缩进来表示范围
6.语句块--就是需要重复使用的代码
7.return: 1 用来返回一个结果/表达式,返回的值是用来告诉调用者
2 return可以省略,省略就表示不需要返回结果,
注意:如果没有写return,默认会执行return None
3return可以用来终止函数,函数默认是函数体执行完后自动终止
例子:计算器
a = 1 其中a跟b是可变化的
b = 1
c = a + b
print(c)
def add(a,b):
c = a + b
return c
例子:def printFozu():
调用格式:
函数名(参数1,参数2,......)
1. 函数名是需要调用的函数的函数名(名字必须一致) printFozu add
2. 函数名后跟(),()中放置需要传递给定义函数的参数(实际参数) 1跟1
3.()可以是空参,即使是空参,()也不能省略
本质:实际参数赋值给形式参数的过程,形式参数指的a跟b
调用例子:
print Fozu()
print(add(2,3))
案例一:
简单的函数
注意:函数需要先定义再使用
需求:通过函数来打印一个语句
定义了函数是不执行的
printStr 出现在函数前面是报错的
def printStr():
print("wen is a nice man")
print("wen is a handsome man")
print("wen is a good man")
#假设第一次调用
printStr
#假设第n个地方调用
printStr()
三 函数的参数:
需求:定义一个函数用来输出姓名,年龄
定义函数的地方,参数名叫形式参数。只定义了函数的名字,没有具体值
调用的时候,实际参数赋值给形式参数的过程
相当于形式参数name = 实际参数name 同时 实际参数 = "死胖子"
def printNameAndAge(name,age):
print("%s的年龄是%d"%(name,age))#这里的name代表的是形式参数
调用
printNameAndAge("金三胖胖",32)
name = "死胖子"
age = 34
调用函数的位置,传入的参数叫实际参数
printNameAndAge(name,age)
注意:调用函数时,传入参数的个数需要与定义函数参数的个数一致
printNameAndAge("三胖子")显示报错缺一个参数
注意:调用函数时,传入参数的顺序需要与定义时一致,
printNameAndAge(78,"三胖子")#虽然不报错,会但顺序错乱
五 函数的返回值
需求:定义一个函数,求两个数的和
# 1.return会将一个结果返回,结果会作为调用者的返回值
2.return 可以不写,不写时默认执行return None,
3.return后也可以跟表达式,如果是表达式,会先执行表达式,
然后将表达式结果返回
4.注意:return可以用来终止函数的执行,
执行return后,后面的语句不会执行
def add(a,b):
c = a + b
return c
print("你已经成功计算出结果")
调用
res = add(100,101)
print(res)
例子:
for i in range(10):
print("哈哈",i) return可以用来终止函数,函数默认是函数体执行完后自动终止
return
6 函数的值传递问题
不可变类型,只改了上面,下面不改
def editNumber(number):
number = 90
print("number的值为:%d"%(number)) number的值为90
num = 100
editNumber(num)
#在看自己的成绩
print(num)
结果100
注意可变类型:一改全都改
def editNmaes(listName):
listName[0] = "马伊琍"
print(listName)
names = ["马蓉","马化腾","马赛克","马云","马克思"]
editNames(names)
print(names)
最后显示为:
["马伊琍","马化腾","马赛克","马云","马克思"]
["马伊琍","马化腾","马赛克","马云","马克思"]
7 函数的关键字
sorted(reverse=True)
需求:定义一个函数,打印姓名,年龄,爱好
def printPerson(name,age,likes):
print("name:%s"%(name))
print("age:%的"%"age")
print("likes:%s"%likes)
printPerson(age=18,name="马蓉"likes=["马赛克","马云","宋喆"])
printPerson(age=18,name="马蓉",["马赛克","马云","宋喆"])
printPerson(["马赛克","马云","宋喆"],age=18,name="马蓉",) #报错的
注意,关键字参数需要写在参数列表的后面,
非关键字参数需要写在所有关键字参数前
关键字参数的关键字名就是形式参数的变量名
printPerson("马蓉",likes=["马赛克","马云","宋喆"],age=18)
8 默认值参数
需求:打印某人的姓名,年龄,性别,爱好,身高
def printPerson(name,age,gender,likes,heigth):
print("name=%s,age=%d.gender=%s,heigth=%d"%(name,age,gender,heigth))
printPerson("金三胖胖",36,"不明"160)
printPerson("金三胖胖",36,160)
定义函数的时候可以在参数列表的后部给参数设置默认值
def printPerson(name,age,likes,heigth=179,gender="男"):
print("name=%s,age=%d.gender=%s,heigth=%d"%(name,age,gender,heigth))
printPerson("金三胖胖",36,"不明"160)
注意:在给函数传递参数的时候,默认值可以不传递
会自动的设置成默认值
如果设置了默认值,同时又传递了该参数,则实际传递的值优先级高
printPerson("金三胖胖",36,160)
9 不定长参数 重点
不定长参数: 一个参数表示多个值 一般用 *args
max(12,23,34,34,...)
需求:求多个数的和
#def addMoreNumber(num1,num2.........):
def addMoreNumber(*args):
print(args)
print(type(args)) 元组
for i in args:
print(i)
用*表示的变量,用来接收任意多个没有命名的变量,
会将这多个变量封装成元组,并传递到函数中
如果没有参数,会是一个空的元组
最好将可变长参数放在列表的后面
#调用
addMoreNumber()
addMoreNumber(12)
addMoreNumber(12,23)
addMoreNumber(12,3,4,56)
def addMoreNumber(name,*args):
print(args)
print(type(args)) 元组
print("name=%s"%(name))
for i in args:
print(i)
addMoreNumber(12,3,4,56,"name=胖胖胖")
addMoreNumber("胖胖",12,3,4,56)
# 完成 求任意多个数的和
def sum(*args):
count = 0
for i in args:
count += i
return count
print(sum(1,2,3,4))
def addMoreNumber(name,*args):
pass
用**表示的参数,用来接收任意多个有命名(key-value)的参数,
会自动将多个参数封装成字典,
参数名作为key,值作为value
如果没有命名的参数传递,则会生成空的字典
def func(**kwargs):
print(kwargs)
print(type(kwargs))
for key,value in kawargs.items()
测试
func()
func(age=10,name="小灰灰")
定义一个通用函数,关键字参数要放在后面
def function(*args,**kwargs):
pass
function(34,23,34,name="hello",age="18")#关键字参数要放在后面
9 匿名函数
了解
bind(函数名)
#def add(a,b):
# return a+b
lambda 表达式:
格式: lambda 形式参数1,形式参数2:结果表达式
#bind(lambda a,b:a+b)
add = lambda a,b:a+b
print(add(1,2))
10 偏函数
需求:将一个字符串数字转换为数字
print(int("10"))
将一个字符串表示的二进制数转换为十进制,默认使用的是十进制
print(int("10",base=2)) 1*2**0+0*2**1
2
print(int("1010",base=2)) 1*2**0+0*2**1+1*2**2+0*2**3
10
def int2(str)
return int(str,base=2)
print(int2("1010"))
print(int2"10")
import functools
偏函数,参数1为需要修改的函数名,参数2为需要设置的默认值
func = functools.partial(int,base=2) func相当于int
func("1010")
print(func("1010"))
一个py文件是一个模块,一个项目里有很多个py文件
12变量的作用域
作用域:变量的使用范围
注意:程序中的变量不是在任何地方都可以使用的
使用的范围是由定义的范围确定的
注意:在python中,只有模块,类,函数会引入新的作用域
while,for,elif,,if不会引入新的作用域
#number = 99
def editNumber():
#pass
number = 100
print(number)
number = 99
editNumber()
print(number)
在函数外面不能使用函数里面定义的变量
def editNumber():
num = 100 报错
print(num)
if True:
num=100
print(num)
if False:
num=100
print(num) 会报错
13 全局变量
num = 100
def editNum():
global num #申明num是全局变量
num = 99
print(num)
editNum()
print(num)
14异常处理
当程序遇到问题(异常)的时候,不直接结束程序(崩溃)
而让程序越过该错误,继续执行
格式1:
try:
可能出现异常的代码
except 异常类型 as e:
处理
try:
res = 5/0
print(res)
print(num)
except ZeroDivisionError as e:
print("ZeroDivisionError异常被抛出了")
except NameError as e
print("NameError异常被抛出了")
print("代码结束了")
注意:可以全部抛出, 抛出任何类型的异常
try:
res = 5/0
print(res)
print(num)
except:
print("抛出异常")#代表抛出任何类型的所有异常
print("代码结束了")
格式2
finally:无论程序是否出现异常,始终会执行该代码块
try:
count = 5/0
print(count)
except ZeroDivisionError as e:
print("ZeroDivisionError异常被抛出了")
finally:
代码块