函数的基础
- 认识函数
def sum1(n):
s = 0
for x in range(1, 101):
s += x
print(s)
sum1(100)
# 1.1什么是函数
'''
函数就是实现某一特定功能的代码的封装.
(函数就是把实现某一个功能的代码打成一个包, 以后再需要直接用函数)
'''
# 2.函数分类(根据函数是谁创建的)
'''
1) 系统函数 - python自带函数:print . input.max.min等
2) 自定义函数 - 自己定义的函数
'''
# 3.定义函数/创建函数 - 造机器
'''
语法:
def 函数名(参数列表)
函数说明文档
函数体
说明:
def - 固定写法
函数名 - 随便写个别重复关键字就行,最好见名知意义,符合命名规则就行,字母小写
( ): - 固定写法
形参列表 - 以'变量名1 ,变量名2,...'这儿的变量名也可以没有
形参的作用: 将函数外部的数据传递到函数里面
怎么确定形参:看实现函数的功能需不需要格外的数据,需要几个
函数说明文档: 就是注释
函数体 - 就是实现函数功能的代码
'''
# 练习: 定义一个函数求任意两个数的和
def sum2(num1, num2):
'''
函数功能
:param num1:
:param num2:
:return:
'''
num3 = num1 + num2
print(num3)
sum2(1, 2)
sum2('wo', 'shi')
# 练习1:定义,统计指定字符串中文的个数
def count_num(ss):
count = 0
for x in ss:
if '一' <= x <= '\u9f5a':
count += 1
print(count)
count_num('斯瓦迪亚1123')
# 练习2:定义,将数据插入到指定列表最前面
def duke(cc, dd):
num = [''] * (len(dd) + 1)
num[0] = cc
for i in range(len(dd)):
num[i + 1] = dd[i]
print(num)
duke('zhu', ['1', 2, 3])
# 定义一个函数,任意整数阶乘
def chengfa(x):
c = x
for i in range(1, x):
c *= i
print(c)
chengfa(4)
# 定义求一个圆的面积
def mianji(r):
import math
s = math.pi * (r ** 2)
print(s)
mianji(3)
# 4.函数的调用 - 使用机器
# 1)定义函数不会执行,调用才会
# 2)怎么调用
'''
语法:
函数名(实参列表)
说明:
a.函数名
b.()
c.实参列表
'''
# 3)函数调用过程
'''
当代码指向到函数调用语句的时候:
第一步: 先回到函数定义的位置
第二步: 传参(用实参给形参赋值)
第三步: 执行函数体
第四步: 确定函数返回值
第五步: 回到函数调用的位置接着往后执行
'''
- 函数的返回值
# 1.返回值
'''
返回值就是从函数内部传递到函数外部的数据
1)怎么将确定函数返回值(怎么将指定的数据作为函数返回值)
看执行函数体的时候有没有遇到return,如果遇到return,后面的值就是返回值;如果没有return,返回值是空值
2) 怎么获取函数返回值
获取函数调用表达式的值就是获取函数的返回值.
函数调用表达式: 调用函数的语句
3)什么时候需要返回值
如果实现函数的功能产生了新的数据,我们就应该将新的数据返回
原因: 返回值不会被删除,调用函数,系统会创建临时的栈区域,用来保存数据,调用完会删除.
'''
def func1( ):
return 100, 200 #(100,200)
x = func1()
print(x)
def func2(n):
print(n)
return 100
func2(2) #2
print(func2(3)) #3 100
def func3(n):
print(n)
x = func3(3) #3
print(x) #NOne
def func5():
return 'abc'
print('abc'[-1], func5()[-1]) #c c
# 关于.函数怎么写的问题
# 哪个是方法不是函数
# 2.return
'''
retuen 在函数中有两个作用:
1)返回返回值
2)提前结束函数 - 执行函数体的时候如果return,函数直接结束
'''
def func1():
print('====')
return
print('+++++')
x =func1()
print(x)
# ====
# 100
# return 后面不写会返回None
- 函数的参数
# 1. 位置参数和关键字参数 -根据实参传递方式分类
'''
1) 位置参数: 以'实参1,实参2,实参3,...'的形式存在,通过位置一一对应的方式来给形参赋值
2) 关键字参数: 以'形参1 =实参1 '根据命名可以位置不同也行
注意: 位置和关键字混用,位置参数要排前面
'''
def func1(x, y, z):
print(f'x:{x}, y:{y}, z:{z}')
func1(10, 20, 30) # x:10, y:20, z:30
func1(20, 10, 30) # x:20, y:10, z:30
func1(x=30, z=20, y=10) # x:30, y:10, z:20
func1(10, z=30, y=30) # x:10, y:30, z:30
# 2.参数默认值 -形参
'''
定义函数可'形参=值'赋默认值,实际不赋值也行
注意:定义函数,没有默认值的要在前面
'''
def func2(x=10,y=20,z=30):
print(f'x:{x}, y:{y}, z:{z}')
func2() #x:10, y:20, z:30
func2(100) #x:100, y:20, z:30
func2(100,200) #x:100, y:200, z:30
func2(100,200,300) #x:100, y:200, z:300
# def func3(x, y=20, z) #这样会报错
# 3.参数类型说明 - 定义函数的时候指定参数类型
'''
参数类型说明可以提示使用者在调用函数的时候该传什么数据:1.清楚2.有代码提示
1) 方法1-没有默认值的参数: 形参:类型名
2)方法2: 给参数赋值默认值,默认值就是参数类型
'''
# def func4(str1):
# pass
def func4(str1:str, list1 =[1]):
str1.upper()
func4('anc', [1,20])
# dict1 ={'a':10, 'b':'abc', 'c': [10,20]}
# key = input('Key:')
# xx = dict1[key]
# ###***有问题
# message = '[''abc'', ''sdsd'']'
# # str1 = '['abc', 'cfd']' #要用不同的引号
# list2 = eval(message) #type:list
# list2.clear()
# 4. 不定长参数 - 解决参数个数不确定的问题
'''
1)带*的不定长
定义函数的时候,如果在某个形参前面加*,那么这个参数就变成了一个不定长参数,调用的时候这个形参可以接受若干个实参
本质:如果形参有*,那么这个参数会变成一个元组,实参就是里面的元素
注意:
a. 带*的不定长参数在传参的时候只能使用位置参数
b.混用参数时,这个时候不定长前用位置参数,后面用关键字
2)带**的不定长参数
本质: 如果形参前有**,那么这个参数就会自动变成一个字典,所有的实参会作为这个字典的键值对
注意:传参的时候只能用关键字传参
'''
# 练习:定义一个函数,求多个数的和
# sum2(10,20)
# sum2(10,20,30)
def func5(*num):
pass
func5()
func5(10,20,30,30,40)
def func6(x,*y):
pass
# func6() #会报错
func6(10)
func6(10,20,30)
def func7(x,*y):
sum1 = x
for i in y:
sum1 += i
print(sum1)
# func6() #会报错
func7(10) #30
func7(10,20,30) #60
def funct1(x, *y, z):
pass
#funct1(10,20,30) #会报错
funct1(10,20,30,z=50)
def func9(**x):
pass
func9()
func9(a=10)
func9(a=0,a1=20,a3=30)
def func10(*args, **kwargs):