认识函数

1.认识函数

1.1什么是函数 - 实现某一特定功能的代码的封装,每个函数都有自己的特定功能

函数把实现某一个功能所有代码打了一个包,每次需要的时候,直接调用

2函数的分类(函数是由谁创建/定义来进行分类)

2.1系统函数 - python自定义函数,需要的时候直接调用

2.2自定义函数 - 由程序员直接创建

3.定义(创建)函数

3.1语法

1
2
3
4
5
6
7
8
def 函数名(形参列表):  
函数说明文档
函数体

## 函数名 - 是标识符,不是关键字,见名知意,字母小写(下划线隔开),不使用系统的函数名,类名,模块名
## 形参列表 - 多个变量用逗号隔开,一个变量是一个形参,可以没有形参
## 形参的作用:将函数外部的数据传递函数到函数里面
## 实现函数功能的语句块

练习1 定义一个函数求两个数的和

1
2
def sum1(x,y):
print(x+y)

练习2:定义一个函数获取指定整数的个位数

1
2
def qugewei(x):
print(x % 10)

练习3:定义一个函数获取指定字符串中数字字符的个数

1
2
3
4
5
6
def count_str(str1):
count1 = 0
for item in str1:
if '0' <= item <= '9':
count1+=1
print("该字符串中数字字符的个数为:",count1)

练习4:定义一个函数将两个字符串合并成一个字符串,合并方式如下:

‘abc’ 和 ‘123’ 合并为:’a1b2c3’

‘abcdef’ 和 ‘123’ 合并为:’a1b2c3def’

‘abc’ 和 ‘12345’ 合并为:’a1b2c345’

方法1

1
2
3
4
5
6
7
8
9
10
11
12
13
def sum_str(str1,str2):
str3 = ''
if len(str1) >= len(str2):
for index in range(len(str2)):
str3 += str1[index] + str2[index]
str3 += str1[len(str2)::1]
print(str3)
else:
for index in range(len(str1)):
str3 += str1[index] + str2[index]
str3 += str2[len(str1)::1]
print(str3)
sum_str('abc','12345')

方法2

1
2
3
4
5
6
7
8
9
def mix_str(str1, str2):
len1 = len(str1)
len2 = len(str2)
length = min(len1, len2)
new_str = ''
for index in range(length):
new_str += str1[index] + str2[index]
new_str += str1[length:] + str2[length:]
print(new_str)

练习5:定义一个函数打印n的阶乘

1
2
3
4
5
def factorial(n):
sum1 = 1
for x in range(1,n+1):
sum1 *= x
print(sum1)

4.调用函数

4.1 定义函数不会执行函数体 - 调用函数的时候才会执行

4.2 语法 - 函数名(实参列表) 函数有形参,必须要传入实参,实参的个数必须和形参一致,且一一对应

5.位置参数和关键字参数

5.1位置参数 - 直接提供形参对应的数据,让实参和形参一一对应

5.2关键字参数 - 以’形参1 = 实参1, 形参2 = 实参2…的方式传参’

5.3位置参数和关键字参数混用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def func1(a, b, c):
print(f'a:{a}, b:{b}, c:{c}')

# 位置参数
func1(100, 200, 300) # a:100, b:200, c:300
func1(200, 100, 300) # a:200, b:100, c:300

# 关键字参数
func1(a=100, b=200, c=300) # a:100, b:200, c:300
func1(c=300, a=100, b=200) # a:100, b:200, c:300

# 混用
func1(10, b=20, c=30)
func1(10, c=30, b=20)
func1(10, 20, c=30)

5.4参数默认值 - 定义函数时可以以 ‘形参名=值’ 的形式给形参提供默认值

有默认值的形参可以不传实参,如果不传实参,调用函数时,该形参使用默认值

1
2
3
4
5
6
def func1(a=10, b=20, c=30):
print(f'a:{a}, b:{b}, c:{c}')
func1() #a:10, b:20, c:30
func1(100) #a:100, b:20, c:30
func1(100,200) #a:100, b:200, c:30
func1(c=300) #a:10, b:20, c:300

如果定义函数时,部分参数有默认值,部分参数没有,没有默认值的参数必须在有默认值的前面

1
2
3
def func1(a, c, b=20):
print(f'a:{a}, b:{b}, c:{c}')
func1(10,30)

6.参数类型说明

6.1有默认值的参数:默认值是什么类型,类型说明就是什么类型

6.2没有默认值的参数,需要在形参后面加 ‘:类型名’

1
2
3
def func4(x: list, y=''):
print(x, y)
func4([1, 2, 3], 'abc')

7.不定长参数

7.1带的不定长参数 - 在形参前加,那么这个形参就可以接收任意多个实参

7.2带*的不定长参数本质就是一个元组,对应的多个实参是元组中的元素

7.3带*的不定长参数,传参的时候必须使用位置参数

7.4如果定长的参数在带*的参数后面(后面的定长参数调用时必须用关键字参数传参)

1
2
3
4
5
def func5(*x):
print(x)
func5()
func5(4)
func5(4, 5)

7.5带两个*的不定长参数

1
2
3
4
5
6
def func9(**x):
print(x)

func9()
func9(a=10)
func9(a=10 ,b=20 ,c=30)

8.函数返回值

8.1返回值就是将函数内部产生的数据传递到函数的外部

8.2函数的功能产生的新的数据时,就可以将新的数据作为返回值返回

8.3在函数体中通过return返回数据 - return 数据

8.4在函数外面如何使用返回值 - 函数调用表达式的值就是获取函数的返回值

8.5return 具有提前结束函数的功能,遇到return之后函数执行结束

8.6当没有返回值时,函数表达式的值为none

1
2
3
4
5
def sum1(num1, num2):
s = num1 + num2
return s

print(sum1(10, 20))
1
2
3
4
5
6
7
8
def func4(x):
if x % 2:
return 100
print("aaa")

print('返回值:',func4(20))
print("="*30)
print('返回值:',func4(21))

作业

1. 编写一个函数,交换指定字典的key和value。

1
例如:dict1={'a':1, 'b':2, 'c':3}  -->  dict1={1:'a', 2:'b', 3:'c'}  
1
2
3
4
5
6
def change1(dict1:dict):
new_dict1 = {}
for key in dict1:
new_dict1[dict1[key]] = key
print(new_dict1)
change1({'a':1, 'b':2, 'c':3})

2. 编写一个函数,提取指定字符串中所有的字母,然后拼接在一起产生一个新的字符串

1
例如: 传入'12a&bc12d-+'   -->  'abcd'  
1
2
3
4
5
6
7
def get_zimu(str1):
new_str1 = ''
for item in str1:
if 'a' <= item <= 'z' or 'A' <= item <= 'Z':
new_str1+=item
print(new_str1)
get_zimu('aldliaw142415weif')

3. 写一个自己的capitalize函数,能够将指定字符串的首字母变成大写字母

1
例如: 'abc' -> 'Abc'   '12asd'  --> '12asd'
1
2
3
4
5
6
7
8
9
10
11
def capitalize1(str1):
new_str1 = ''
if 'a' <= str1[0] <= 'z':
new_str1 += chr(ord(str1[0]) - 32)
for index in range(1,len(str1)):
if 'A' <= str1[index] <= 'Z':
new_str1 += chr(ord(str1[index]) + 32)
else:
new_str1 += str1[index]
print(new_str1)
capitalize1('wfxMYdfewe')

4. 写一个自己的endswith函数,判断一个字符串是否已指定的字符串结束

1
2
例如: 字符串1:'abc231ab' 字符串2:'ab' 函数结果为: True
字符串1:'abc231ab' 字符串2:'ab1' 函数结果为: False
1
2
3
4
5
6
7
8
9
10
11
def endswith1(str1):
str5 = 'c'
if str5 not in str1:
print(False)
else:
if str5 == str1[-len(str5)::1]:
print(True)
else:
print(False)

endswith1('ababcdc')

5. 写一个自己的isdigit函数,判断一个字符串是否是纯数字字符串

1
2
3
例如: '1234921'  结果: True
'23函数' 结果: False
'a2390' 结果: False
1
2
3
4
5
6
7
8
9
def isdigit1(str1:str):
for item in str1:
if not '0' <= item <= '9':
print(False)
break
else:
print(True)

isdigit1('123456')

6. 写一个自己的upper函数,将一个字符串中所有的小写字母变成大写字母

1
例如: 'abH23好rp1'   结果: 'ABH23好RP1'   
1
2
3
4
5
6
7
8
9
def upper1(str1):
new_str1 = ''
for i in str1:
if 'a' <= i <= 'z':
new_str1 += i.upper()
else:
new_str1+=i
print(new_str1)
upper1('a2h2klm12+')

7. 写一个自己的rjust函数,创建一个字符串的长度是指定长度,原字符串在新字符串中右对齐,剩下的部分用指定的字符填充

1
2
例如: 原字符:'abc'  宽度: 7  字符:'^'    结果: '^^^^abc'
原字符:'你好吗' 宽度: 5 字符:'0' 结果: '00你好吗'

8. 写一个自己的index函数,统计指定列表中指定元素的所有下标,如果列表中没有指定元素返回-1

1
2
3
例如: 列表: [1, 2, 45, 'abc', 1, '你好', 1, 0]  元素: 1   结果: 0,4,6  
列表: ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权'] 元素: '赵云' 结果: 0,4
列表: ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权'] 元素: '关羽' 结果: -1
1
2
3
4
5
6
7
8
9
10
def index1(list1,item):
count = 0
for i in list1:
if i == item:
print(count, end=',')
count += 1
if count == 0:
print('-1')

index1([1, 2, 45, 'abc', 1, '你好', 1, 0],1)

9. 写一个自己的len函数,统计指定序列中元素的个数

1
2
3
例如: 序列:[1, 3, 5, 6]    结果: 4
序列:(1, 34, 'a', 45, 'bbb') 结果: 5
序列:'hello w' 结果: 7

10. 写一个自己的max函数,获取指定序列中元素的最大值。如果序列是字典,取字典值的最大值

 
1
2
3
例如: 序列:[-7, -12, -1, -9]    结果: -1   
序列:'abcdpzasdz' 结果: 'z'
序列:{'小明':90, '张三': 76, '路飞':30, '小花': 98} 结果: 98

11. 写一个函数实现自己in操作,判断指定序列中,指定的元素是否存在

 
1
2
例如: 序列: (12, 90, 'abc')   元素: '90'     结果: False
序列: [12, 90, 'abc'] 元素: 90 结果: True

12. 写一个自己的replace函数,将指定字符串中指定的旧字符串转换成指定的新字符串

1
2
3
```python
例如: 原字符串: 'how are you? and you?' 旧字符串: 'you' 新字符串:'me' 结果: 'how are me? and me?'
```