主要内容:函数
一、函数的创建和调用
1、使用关键字def创建函数
创建一个空函数
2、函数的返回值:就是程序中函数完成一件事情之后,最后个调用者的结果,没有返回值,默认会返回None
def f2c(fahrenheit):
"""
华氏温度转化为摄氏温度
:return:
"""
celsius = (fahrenheit-32)/1.8
return fahrenheit,celsius
if __name__ == '__main__':
fahrenheit,celsius = f2c(100)
print('华氏%s度转化摄氏为%s度'%(fahrenheit,celsius))
运行结果为
华氏100度转化摄氏为37.77777777777778度
3、定义函数的格式
def函数名(参数1,参数2,参数n):
函数体(语句块)
1)函数名是命名规则要符合的python中的命名要求。一般用小写字母和下划线、数字组合
2)def是定义函数的关键字,这个简写来源英文单词define
3)函数名后面是圆括号,括号里面。可以有参数列表,也可以,没有参数
4)括号后面的冒号一定不能少
5)函数体(语句块),相对于def缩进,按照python习惯,缩进四个空格
4、函数的调用
def printOneline():
print('_'*20)
def printSumline(sum):
i = 0
'''
多打印几条横线
:param sum:
:return:
'''
while i<sum:
printOneline()
i += 1
if __name__ == '__main__':
printSumline(3)
运行结果为
____________________
____________________
____________________
5、局部变量
1)局部变量,就是在函数内部定义的变量
2)不同的函数,可以定义相同的名字的局部变量,但是 各用各不会产生影响
3)局部变量的作用,为了临时保证数据需要在函数中定义变量来进行存储,这就是它的作用
def save_money(money):
allmoney = 100
print('存钱之前为:',allmoney)
allmoney += money
print('存钱之后为:',allmoney)
def view_money():
allmoney = 500
print('查询金额为:',allmoney)
if __name__ == '__main__':
save_money(50)
view_money()
运行结果如下
存钱之前为: 100
存钱之后为: 150
查询金额为: 500
6、全局变量
1)在函数外边定义的变量叫做全局变量
2)全局变量能够在所有的函数中进行访问
3)如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
4)如果全局变量的名字和局部变量的名字相同那么使用局部变量采用就近原则
#全局变量
allmoney = 100
def save_money(money):
#使用global声明修改全局变量
global allmoney
print('存钱之前为:',allmoney)
allmoney += money
print('存钱之后为:',allmoney)
def view_money():
print('查询金额为:',allmoney)
if __name__ == '__main__':
save_money(50)
view_money()
运行结果如下
存钱之前为: 100
存钱之后为: 150
查询金额为: 150
global的本质是声明可以修改全局变量的指向,即变量可以指向新的数据。
1)不可变类型的变量:指向的数据不能修改,不使用gaobal时无法修改全局变量
2)可变类型的全局变量:指向的数据可以 修改,不使用gaobal时可以修改全局变量
7、参数
1、定义时小括号里面的参数,用来接收参数的称为‘形参’
2、使用时小括号中的参数,用来传递给函数的称为‘实参’
3、调用函数时如果参数个数不对,python解释器会自动检查出来,并抛出TypeError:
***如果参数类型不对,python解释器就无法帮我们检查。
**数据类型可以使用内置函数isinstance实现
4、默认参数可以降低调用函数的难度:
**有多个参数时,变化大放前面,变化小的放后面;
**必选参数在前,默认参数在后。
5、可变参数就是传入的参数 个数是可变的,可以使1个、2个到任意个,还可以使0个。*args
**以数字题为例子给定一组数字a,b,c
**计算 a 2 + b 2 + c 2 + …
参数组合是指可以必选参数、默认参数、可变参数和关键字参数一起使用。
参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数
6、匿名函数
1、匿名函数指一类无需定义标识符的函数或子程序。python用 lambda语法定义匿名函数,只需用表达式而无须申明。
sum = lambda arg1,arg2 : arg1+arg2
print(sum(10,20))
应用场合1:函数作为参数传递
应用场景2:作为内置函数的参数
import prettytable as pt
def show(goods):
table = pt.PrettyTable()
table.field_names = {'name','Count','Price'}
for good in goods:
table.add_row(good)
print(table)
goods = [
#商品名称 商品数量 商品价格
('python核心编程',100,70),
('Java核心编程',40,54),
('php核心编程',40,85),
('ruby核心编程',1000,50)
]
print('商品数量进行排序')
goods.sort(key=lambda x:x[1])
show(goods)
print('按照商品价格进行排序')
goods.sort(key=lambda x:x[2])
show(goods)
运行结果如下
商品数量进行排序
+----------------+-------+-------+
| name | Price | Count |
+----------------+-------+-------+
| Java核心编程 | 40 | 54 |
| php核心编程 | 40 | 85 |
| python核心编程 | 100 | 70 |
| ruby核心编程 | 1000 | 50 |
+----------------+-------+-------+
按照商品价格进行排序
+----------------+-------+-------+
| name | Price | Count |
+----------------+-------+-------+
| ruby核心编程 | 1000 | 50 |
| Java核心编程 | 40 | 54 |
| python核心编程 | 100 | 70 |
| php核心编程 | 40 | 85 |
+----------------+-------+-------+
7、递归函数
1、函数可以自己在内部调用自己本身,这个函数就是递归函数
2、递归求阶乘
3、递归求解汉诺塔
moveCount = 0
def hanio(num,a='A',b='B',c='C'):
if num == 1:
print(a,'--->',c)
global moveCount
moveCount += 1
else:
hanio(num-1,a,c,b)
hanio(1,a,b,c)
hanio(num-1,b,a,c)
hanio(4)
print('一共移动了%s次'%moveCount)
运行结果为
A ---> B
A ---> C
B ---> C
A ---> B
C ---> A
C ---> B
A ---> B
A ---> C
B ---> C
B ---> A
C ---> A
B ---> C
A ---> B
A ---> C
B ---> C
一共移动了15次
例一:
用函数实现输入某年某月某日,判断这一天是这一年的第几天?闰年情况也
考虑进去
代码如下:
def leap_year():
year = eval(input('请输入查询的年份:'))
month = eval(input('请输入要查询的月份:'))
day = eval(input('请输入要查询的日:'))
days = [0,31,28,31,30,31,30,31,31,30,31,30,31]
if (year % 4 == 0 and year %100 != 0) or year % 400 == 0:
many_day = 0
for i in range(1, month):
many_day += days[i]
if month >= 3:
many_day_end = many_day + (day + 1)
else:
many_day_end = many_day + day
print(many_day_end)
else:
many_day = 0
for i in range(1,month):
many_day += days[i]
many_day_end = many_day + day
print(many_day_end)
leap_year()
运行结果
请输入查询的年份:2000
请输入要查询的月份:3
请输入要查询的日:1
61
例二:
编写“学生管理系统”,要求如下:
1) 必须使用自定义函数,完成对程序的模块化
2)学生信息至少包含:姓名、年龄、学号,除此以外可以适当添加
3)必须完成的功能:添加、删除、修改、查询、退出
代码如下:
def student():
print("-" * 30)
print(" 学生管理系统 ")
print(" 1.添加学生的信息")
print(" 2.删除学生的信息")
print(" 3.修改学生的信息")
print(" 4.查询学生的信息")
print(' 5.遍历所有学生的信息')
print(" 6.退出系统")
print('-' * 30)
students = []
while True:
#对用户呈现选择栏
student()
key = int(input('请输入要进行的操作:'))
if key == 1:
print('您选择了学生信息的添加')
stuname = input('请输入学生的姓名')
stuid = input('请输入学生的学号')
stuage = input('请输入学生的年龄')
#定义一个字典用来存放学生信息
stuInfo = {}
stuInfo['name'] = stuname
stuInfo['id'] = stuid
stuInfo['age'] = stuage
students.append(stuInfo)
elif key == 2:
print('您选择了学生信息的删除')
del_student = input('请输入要删除学生学号:')
i = 0
leap = 0
for temp in students:
if temp['id'] == del_student:
leap = 1
break
else:
i += 1
if leap == 0:
print('没有这个学生')
else:
del students[i]
print('删除成功!')
elif key == 3:
print('那您选择的是学生信息的修改')
alterid = input('请输入要修改的学生的学号:')
i = 0
leap = 0
for temp in students:
if temp['id'] == alterid:
leap = 1
break
else:
i += 1
if leap == 1:
while True:
alterNum = int(input('请选择您要修改的项目1-->name,2-->id,3-->age '))
if alterNum == 1:
newname = input('输入要修改后的name:')
i = 0
leap1 = 0
for item in students:
if item['name'] == newname:
leap1 = 1
break
else:
i += 1
if leap1 == 1:
print('姓名重复修改失败!')
else:
item['name'] = newname
break
elif alterNum == 2:
newid = input('输入要修改后的id:')
i = 0
leap2 = 0
for item in students:
if item['id'] == newid:
leap2 = 1
break
else:
i += 1
if leap2 == 1:
print('学号重复修改失败!')
else:
item['id'] = newid
break
else:
newage= input('输入要修改后的age:')
i = 0
leap3 = 0
for item in students:
if item['age'] == newage:
leap3 = 1
break
else:
i += 1
if leap3 == 0:
print('数据重复修改失败!')
else:
item['age'] = newage
break
else:
print('此学生不存在!')
elif key == 4:
print('您选择了学生信息的查询')
fun_student = input('请输入要查询学生学号:')
i = 0
leap = 0
for temp in students:
if temp['id'] == fun_student:
leap = 1
break
else:
i += 1
if leap == 0:
print('没有这个学生')
else:
print('查询学生信息如下:%s %s %s'%(temp['name'],temp['id'],temp['age']))
print('查询成功!')
elif key == 5:
print('学生信息如下')
print('name id age')
for temp in students:
print('%s %s %s'%(temp['name'],temp['id'],temp['age']))
print('*'* 20)
elif key == 6:
print('谢谢使用学生管理系统')
break
with open('info_high', 'w') as f:
f.write('%s\n'%students)
f.close
例三:
用函数实现求100-200里面所有的素数。
提示:素数的特征是除了1和其本身能被整除,其它数都不能被整除的数
代码如下:
def prinme(num):
for i in range(3,num):
if num % i == 0:
return False
else:
return True
prinme_list = [num for num in range(100,200) if prinme(num)]
print(prinme_list)
运行结果如下
[101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]
例四:
编程实现 9*9乘法表
代码如下:
def multplication(num:int)->int:
for i in range(1,10):
product = i * num
print('%d*%d=%d'%(num,i,product),end='; ')
print('\n')
multplication(1)
multplication(2)
multplication(3)
multplication(4)
multplication(5)
multplication(6)
multplication(7)
multplication(8)
multplication(9)
例五:
对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
f(13) = 12 + 32 = 10
f(207) = 22 + 02 + 7**2 = 53
代码如下:
def f(n):
str_n = str(n)
sum = 0
for item in str_n:
sum += int(item) ** 2
return sum
print('f(13)=1**2+3**2=%d'%f(13))
print('f(207)=2**2+0**2+7**2=%d'%f(207))
例六:
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输
入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
def prinme(num):
for i in range(3, num):
if num % i == 0:
return False
else:
return True
prinme_list = [num for num in range(3, 1000) if prinme(num)]
int_n = int(input('请输入一个3-1000的整数:'))
sum = 0
for i in prinme_list:
for a in prinme_list:
if int_n == (i + a) and i <= a:
sum += 1
else:
pass
print('输出:',sum)