函数基础
定义函数
-
认识函数 什么是函数:函数就是实现某一特定功能的代码的封装(每个函数都有自己特定的功能) 函数就是把实现某一个功能的所有代码打成了一个包,每次需要这个功能的时候不需再重复写 这段代码,而是使用函数。 -
函数的分类
- 系统函数 - 由Python创建的函数;这类函数只需要在需要他的功能的时候调用他即可(系统已经造好的机器), 例如:print、input、type、max、min、sum、id…等等
- 自定义函数 - 由程序员自己创建的函数;(自己造的机器)
-
定义函数
-
语法: def 函数名(形参列表): 函数说明文档 函数体 -
说明: def - 固定写法 函数名 - 程序员自己命名; 两个要求:1、是标识符;2、不是关键字 三个规范:1、见名知义(看到函数名知道大致功能);2.字母都小写,多个单词 用划线隔开;3.不用系统函数名、类名、模块名 (): - 固定写法 形参列表 - 格式:使用多个变量名,用逗号隔开;其中一个变量就表示一个形参。也可 以没有形参 作用:将函数外部的数据传递到函数里面 函数说明文档 - 本质就是一个多行注释(相当于说明书) 函数体 - 就是和 def 保持一个缩进的一条或多条语句,函数体就是实现函数功能的代码 -
初学者定义函数的步骤 第一步:确定函数的功能 第二步:根据功能,确定函数名 第三步:确定形参;看实现函数的功能是否需要额外的数据、需要几个 第四步:利用形参提供的数据,实现函数功能 第五步:确定返回值 第六步:写函数说明文档 练习1:定义一个函数求两个数的和 def sum1(x, y):
'''
求两个数的和
:param x: 提供第一个加数
:param y: 提供第二个加数
:return: None
'''
i = x + y
print(i)
练习2:定义一个函数获取指定整数的个位数 def ge(num):
'''
获取个位数
:param num: 提供指定整数
:return: 无
'''
x = num % 10
print(x)
练习3:定义一个函数获取指定字符串中数字字符的个数 def num_count(str1):
'''
获取字符串中数字的个数
:param str1: 提供字符串
:return: 无
'''
count = 0
for i in str1:
if '0' <= i <= '9':
count += 1
print(count)
练习4:定义一个函数将两个字符串合并成一个字符串,合并方式如下:
def new_str(str1, str2):
'''
合并两个字符串
:param str1: 提供第一个字符串
:param str2: 提供第二个字符串
:return: 无
'''
len1 = len(str1)
len2 = len(str2)
length = min(len1, len2)
str3 = ''
for i in range(length):
str3 += str1[i] + str2[i]
str3 += str1[length:] + str2[length:]
print(str3)
练习5:定义一个函数打印10的阶乘 def fac(n):
'''
求指定数的阶乘
:param n: 提供数值
:return: 无
'''
x = 1
for i in range(1, n+1):
x *= i
print(x)
函数的调用
- 调用函数
1)定义函数的时候不会执行函数体,调用函数才会执行函数体。调用多少次,函数就会执行多少次 2)调用函数额时候,实参的个数由被调用的函数的形参决定,实参给形参赋值的过程叫传参 3)函数调用过程: 当代码执行到函数调用语句的时候,后面的执行过程如下: 第一步:回到函数定义的位置 第二步:传参(实参给形参赋值) 第三步:执行函数体 第四步:获取函数返回值 第五步:回到函数调用的位置,接着往后面执行 语法: 函数名(实参列表) 说明: 函数名 - 需要调用的函数名(函数名对应的函数必须是已经定义好的函数) () - 固定写法 实参列表 - 多个数据用逗号隔开 实参就是给形参赋值的(实参就是通过形参传递到函数内的数据)
示例:
def func1():
print('+++++')
print('-----')
print('6666')
func1()
def fun2(x, y, z):
print(f'x:{x}, y:{y}, z:{z}')
fun2(10, 20, 30)
函数的参数
-
位置参数和关键字参数 根据调用函数的时候实参提供方式的不同,将实参分为位置参数和关键字参数两种
-
位置参数 直接给实参提供数据,让实参与形参在位置上一一对应,例如: def func1(x,y,z) ———> func1(10,20,30) ———> x = 10,y = 20,z = 30
实参位置变化,对应形参赋的值也会变化 -
关键字参数 以’形参1 = 实参1’、‘形参2 = 实参2’、‘形参3 = 实参3’…的形式传参,例如: def func1(x,y,z) ———> func1(x = 10,y = 20,z = 30)
实参位置变化,对应形参赋的值不会变化 -
位置参数与关键字参数混用 二者混用的时候必须保证位置参数在关键字参数前面 def fun1(x,y,z) ———> fun1(10,y = 20,z = 30)
def fun1(x,y,z) ———> fun1(10, 20,z = 30)
def fun1(x,y,z) ———> fun1(10, y=20, 30) 报错
-
参数默认值 定义函数的时候可以 以 ‘形参名 = 值’ 的形式给形参提供默认值;如果一个参数有默认值, 可以不用传参。 注意:
-
给有默认值参数后面的参数赋值,必须用关键字参数赋值 -
如果定义函数的时候有的参数有默认值,有的参数没有,那么没有默认值的参数必须放在有默认值的参数前面 def func2(x = 10, y = 20, z = 30):
print(x, y, z)
func2()
func2(100)
func2(z=300)
-
参数类型说明
-
有默认值的参数:默认值是什么类型,类型说明就是什么类型 -
没有默认值的参数:需要在形参后加 ’ : 类型名 ’ def func4(x :list, y = '四川'):
pass
-
不定长参数 - 解决在不知道有多少个变量情况下的问题
-
带 * 号的不定长参数 - 如果在一个形参前加 * ,那么这个形参就可以接受任意多个实参 带 * 号的不定长参数的本质就是一个元组,对应的多个实参是元组中的元素 注意: ? 1)带 * 的不定长参数,传参时必须使用位置参数 ? 2)给带 * 的参数后面的参数赋值(有的时候是直接在*号后面),必须使用关键字参数赋值 -
带 ** 的不定长参数 - 如果在一个形参前加 * ,那么这个形参就可以接受任意多个实参 带 ** 号的不定长参数的本质就是一个字典,对应的多个实参是字典中的键值对 注意: ? 1)带 ** 的不定长参数,传参时必须使用关键值参数 def func7(y, *x):
print(y, x)
func7(10)
func7(10, 20, 30)
练习:定义一个函数求多个数的和 def func9(*x):
s = sum(x)
print(s)
func9(10, 20, 30)
-
函数的返回值
-
返回值的作用 返回值的作用就是将函数内部产生的数据传递到函数的外部 初学者如何确定函数需不需要返回值:看函数的功能有没有产生新的数据,如果有就将新的数据作为返回值返回 -
确定函数的返回值(怎么将数据作为返回值) 在函数体中通过 return 关键字返回函数的返回值:return 数据 每一个函数调用语句其实都有一个结果,这个结果就是这次调用的时候函数的返回值 注意: ? 1)如果执行函数体的时候没有遇到return,返回值就是None ? 2)return还具有提前结束函数的功能(函数在哪遇到return,就在那里结束,后续代码不 会再执行,相当于循环结构中的break) -
怎么在函数外面获取函数的返回值 获取函数调用表达式的值就是获取函数的返回值 一个函数的返回值是什么,就看调用函数的时候,return后面的值是什么; return后面的值是什么,函数调用表达式的结果就是什么; 函数的返回值能进行的操作,函数调用表达式也都可以。 def func1(x, y):
s = x + y
return s
s = func1(10, 20)
print(s)
d = func1(10, 20) + 40
print(d)
练习
-
编写一个函数,交换指定字典的key和value。 例如:dict1={'a':1, 'b':2, 'c':3} --> dict1={1:'a', 2:'b', 3:'c'}
def exchange_key_value(dict1):
dict2 = {}
for key in dict1:
dict2[dict1[key]] = key
return dict2
print(exchange_key_value(dict1))
-
编写一个函数,提取指定字符串中所有的字母,然后拼接在一起产生一个新的字符串 例如: 传入'12a&bc12d-+' --> 'abcd'
def get_letter(str1):
str2 = ''.join(i for i in str1 if 'A' <= i <= 'Z' or 'a' <= i <= 'z')
return str2
print(get_letter(str1))
-
写一个自己的capitalize函数,能够将指定字符串的首字母变成大写字母 例如: 'abc' -> 'Abc' '12asd' --> '12asd'
def capitalize(str1):
str2 = ''.join(chr(ord(str1[0]) - 32) if 'a' <= str1[0] <= 'z' else str1[0]) + str1[1:]
return str2
print(capitalize(str1))
-
写一个自己的endswith函数,判断一个字符串是否已指定的字符串结束 例如: 字符串1:'abc231ab' 字符串2:'ab' 函数结果为: True
字符串1:'abc231ab' 字符串2:'ab1' 函数结果为: False
def endswith(str1, str2):
len2 = len(str2)
result = False
if str1[-len2:] == str2:
result = True
return result
print(endswith(str1, str2))
-
写一个自己的isdigit函数,判断一个字符串是否是纯数字字符串 例如: '1234921' 结果: True
'23函数' 结果: False
'a2390' 结果: False
def isdigit(str1):
for i in str1:
if not('0' <= i <= '9'):
return False
else:
return True
print(isdigit(str1))
-
写一个自己的upper函数,将一个字符串中所有的小写字母变成大写字母 例如: 'abH23好rp1' 结果: 'ABH23好RP1'
def upper(str1):
str2 = ''
for i in str1:
if 'a' <= i <= 'z':
str2 += chr(ord(i) - 32)
else:
str2 += i
return str2
print(upper(str1))
-
写一个自己的rjust函数,创建一个字符串的长度是指定长度,原字符串在新字符串中右对齐,剩下的部分用指定的字符填充 例如: 原字符:'abc' 宽度: 7 字符:'^' 结果: '^^^^abc'
原字符:'你好吗' 宽度: 5 字符:'0' 结果: '00你好吗'
def rjust(str1, str2, length):
str3 = ''.join(str2 for _ in range(length - len(str1))) + str1
return str3
print(rjust(str1, str2, length))
-
写一个自己的index函数,统计指定列表中指定元素的所有下标,如果列表中没有指定元素返回-1 例如: 列表: [1, 2, 45, 'abc', 1, '你好', 1, 0] 元素: 1 结果: 0,4,6
列表: ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权'] 元素: '赵云' 结果: 0,4
列表: ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权'] 元素: '关羽' 结果: -1
def index(list1, element):
result = []
if element not in list1:
return -1
else:
for index in range(len(list1)):
if list1[index] == element:
result += [index]
return result
print(index(list1, element))
-
写一个自己的len函数,统计指定序列中元素的个数 例如: 序列:[1, 3, 5, 6] 结果: 4
序列:(1, 34, 'a', 45, 'bbb') 结果: 5
序列:'hello w' 结果: 7
def len(seq):
count = 0
for i in seq:
count += 1
return count
print(len(seq))
-
写一个自己的max函数,获取指定序列中元素的最大值。如果序列是字典,取字典值的最大值 例如: 序列:[-7, -12, -1, -9] 结果: -1
序列:'abcdpzasdz' 结果: 'z'
序列:{'小明':90, '张三': 76, '路飞':30, '小花': 98} 结果: 98
xl = {'小明': 90, '张三': 76, '路飞': 30, '小花': 98}
def max(xl):
if type(xl) == dict:
new_xl = list(xl.values())
max_xl = new_xl[0]
for i in new_xl:
if i >= max_xl:
max_xl = i
else:
max_xl = xl[0]
for j in xl:
if j >= max_xl:
max_xl = j
return max_xl
print(max(xl))
-
写一个函数实现自己in操作,判断指定序列中,指定的元素是否存在 例如: 序列: (12, 90, 'abc') 元素: '90' 结果: False
序列: [12, 90, 'abc'] 元素: 90 结果: True
def in_func(str1, element):
for i in str1:
if i == element:
return True
return False
print(in_func(str1, element))
-
写一个自己的replace函数,将指定字符串中指定的旧字符串转换成指定的新字符串 例如: 原字符串: 'how are you? and you?' 旧字符串: 'you' 新字符串:'me' 结果: 'how are me? and me?'
def replace(str1, old_str, new_str):
after_split = str1.split(old_str)
length = len(after_split)
new_str1 = ''
for index in range(length):
if index == length - 1:
new_str1 += after_split[index]
else:
new_str1 += after_split[index] + new_str
return new_str1
print(replace(str1, old_str, new_str))
|