python(函数)

01_函数的理解和定义

def 函数名():
    函数体
范例:
def print(self, *args, sep=' ', end='\n', file=None):
def min(*args, key=None):
定义一个函数
# 在没有调用函数的情况下,函数是不会被执行的
def hello():
    print('hello')
    print('hello')
调用函数
hello()

在这里插入图片描述
在这里插入图片描述

函数里面嵌套函数
def fentiao():
    print('is fentiao....')
    def westos():
        print('westos')
    westos()	##只能在函数内被调用
# westos()	##函数内嵌套的函数不能单独被调用
fentiao()

在这里插入图片描述
在这里插入图片描述

def func1(a):	# 定义函数时的变量a称为形式参数,变量名可以任意起
    print('hello %s' %(a))
# 调用函数时的参数称为实参,该参数必须是实际存在的
func1(12)
func1('linux')
func1('python')

在这里插入图片描述

02_函数练习01

*** 练习1:
编写一个名为collatz()的函数,它有一个名为number的参数。
	如果参数是偶数,那么collatz()就打印出number//2
	如果number是奇数,collatz()就打印3*number+1
代码:
def collatz(number):
    # if number % 2 == 0:	##常用的一般方法
    #     print(number//2)
    # else:
    #     print(3*number+1)
    print(number//2 if number %2 ==0 else 3 * number +1)	##python特殊方法
collatz(2)

在这里插入图片描述

03_函数动态添加成员

def fun():		##类似与c语言中的函数迭代,通过函数内调用该函数,使其一直循环
    print(fun.x)
    fun()

# # 动态添加	## 一直陷入死循环
fun.x = 3
fun()

# 动态删除
del fun.x
fun()

04_函数的返回值

函数调用时一般有返回值,没有定义返回值的时候,python中默认返回None
def hello():
    print('hello')
res = hello()
print(res)

在这里插入图片描述

def hello():
    # return 返回的表达式或者变量
    return 'hello'
res = hello()
print(res)

在这里插入图片描述

05_return的应用

随机生成20个学生的成绩
判断这个20个学生的等级

代码:
import random
def level(score):
    if 90<score<=100:
        return 'A'
    elif 80<score<=90:
        return 'B'
    elif 60<score<=80:
        return 'C'
    else:
        return 'D'
for i in range(20):
    score=random.randint(1,100)
    res=level(score)
    print('成绩为:%d,等级为:%s' %(score,res))

在这里插入图片描述

06_多个返回值

def fun(a):
    # 接收一个列表,求这个列表的最大值,平均值,最小值
    max_num = max(a)
    min_num = min(a)
    avg_num = sum(a)/len(a)
    # python函数中,只能返回一个值
    # 如果非要返回多个值,会把返回的值封装为一个元组数据类型
    return max_num,min_num,avg_num

variables = fun([34,1,2,3,4,5,6,7,421])
print(variables,type(variables))

在这里插入图片描述

07_函数形参之四大参数类型

参数:形参 实参
形参的分类:位置参数 默认参数 可变参数 关键字参数

# 位置参数:形参和实参必须保持一致
def getInfo(name, age):  # 按照位置传递参数
    print(name, age)
getInfo('name',18)
getInfo(age=18, name='name')	# 位置可以不同,但必须要给形参赋值

在这里插入图片描述

# 默认参数:形参和实参可以不一致
def mypow(x,y=2):	
    """
    求x的y次方
    :param x:
    :param y:
    :return:
    """
    print(x**y)
mypow(4)	##可以不用给y赋值,默认y=2
mypow(4,3)	##给y赋值后y=3

在这里插入图片描述

# 可变参数
def mySum(*args):
    """
    需求:用户可以传递任意的值,计算数值的和
    *args:是一个可变参数
    args:是元组数据类型
    :param args:
    :return:
    """
    #print(args,type(args))
    sum = 0
    for item in args:
        sum += item
    print(sum)
mySum(1,2,3,4,5,6,7,8)

在这里插入图片描述

# 关键字参数
def getStuInfo(name,age,**kwargs):	##kwargs表示的是字典类型参数
    print(name,age)
    print(kwargs)

getStuInfo('westos',11,hobbies=['code','running'],gender='female')

在这里插入图片描述

nums = [1,2,3,4,5,6]
nums1 = (2,5,6,7,9,10)
nums2 ={1,2,3,4,5,6,7,8}
mySum(*nums)	##*表示对列表,元组,集合进行解包,将所包含的数据一个一个输入到函数中
mySum(*nums1)
mySum(*nums2)

在这里插入图片描述

例子:
score = (12,23,56,78,90)
minscore,*middlescore,maxscore = score
print(*middlescore)
print(middlescore)

在这里插入图片描述

# 如果要对字典进行解包,一个星号:获取key值,两个星号:获取key-value值
d = dict(a=1,b=2)
print(*d)
getStuInfo('westos',11,**d)

在这里插入图片描述

08_函数练习——平方等式

题目需求:
    对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
    f(13) = 1**2 + 3**2 = 10
    f(207) = 2**2 + 0**2 + 7**2 = 53
    下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b,
    且k*f(n)=n
输入:
    第一行包含3个正整数k,a, b, k>=1,  a,b<=10**18, a<=b;
输出:
    输出对应的答案;
范例:
    输入: 51 5000 10000
    输出: 3
代码:
def f(num):
    sum=0
    num=str(num)	## 1.先把数字转换成为字符串
    for i in num:	## 2.计算字符串中每个数的平方
        sum+=int(i)**2
    return sum
s=input('输入k,a,b:')	##1.接收变量k,a,b
li=s.split()		##存储整型k,a,b,用.split()函数将字符串分离成列表
k,a,b=li		
count=0
for i in range(int(a),int(b)+1):
    if int(k)*f(i)==i:	##进行判断是否满足条件
        count+=1
print(count)

在这里插入图片描述

09_函数的作用域

作用域
    局部作用域
    全局作用域
# 全局作用域:作用于整个程序
num = 10
print('out fun: id=',id(num))
def fun():
	#局部作用域,在函数运行时生效,函数运行结束则释放
     	num =2
    	print('in fun:id=',id(num))
     	print('in fun:num = %s' %(num))
fun()
print('out fun: num=%s' %(num))

在这里插入图片描述

num = 10
def fun():
    # 通过global关键字声明局部变量为全局变量
    # 函数执行完毕,变量依然生效
    global num
    num = 2
fun()
print(num)

在这里插入图片描述

10_函数练习02

 1.Collatz序列
编写一个名为collatz()的函数,它有一个名为number的参数。
如果参数是偶数,那么collatz()就打印出number//2,并返回
该值。如果number是奇数,collatz()就打印并返回3*number+1。
然后编写一个程序,让用户输入一个整数,并不断对这个数
调用collatz(),直到函数返回值1(令人惊奇的是,这个序列
对于任何整数都有效,利用这个序列,你迟早会得到1!既使数学
家也不能确定为什么。你的程序在研究所谓的“Collatz序列”,
它有时候被称为“最简单的、不可能的数学问题”)。
- 输入:
    3

- 输出:
    10
    5
    16
    8
    4
    2
    1
代码:
def collatz():
    global number	##定义全局变量,通过判断奇偶将变换的值重新附给number
    if number%2==0:
        number=number//2
    else:
        number=3*number+1
    return number
number=int(input('输入整数:'))
while number!=1:	##判断number是否为1,不断循环打印number值
    print(collatz())

在这里插入图片描述

11_参数检测

def add(x, y):
    ##isinstance(x,y)函数判断变量x是否是y数据类型,是为真,否为假
    if isinstance(x, (int, float)) and isinstance(y, (int, float)):
        return x + y
    else:
        print('Error:')

res = add(2.5,2)
print(res)

在这里插入图片描述

12_函数练习03

编写函数,计算字符串匹配的准确率

代码:
def Rate(orgin,userInput):
    if not (isinstance(orgin,str) and isinstance(userInput,str)):
        print('The tow parameters must be string')
        return
    if len(orgin) < len(userInput):
        print('Sorry.')
        return
    right = 0
    for orgin_char,user_char in zip(orgin,userInput):
        if orgin_char == user_char:
            right += 1
    return right/len(orgin)

a = 'have a nice day'
b = 'Have b aaaa Day'
print(Rate(a,b)

在这里插入图片描述

13_可变参数练习

案例1:
    编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
    元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数.
代码:
def cacluate(*args):
    avg_num=sum(args)/len(args)
    li=[]
    for i in args:
        if i > avg_num:
            li.append(i)
    return avg_num,li
print(cacluate(1,2,3,4,5,6,7,8,9))

在这里插入图片描述

案例2:
  编写一个函数, 接收字符串参数, 返回一个元组,'ehllo WROLD'
  元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
代码:
def getstr(a):
    if not isinstance(a,str):
        print('error')
        return
    else:
        count_lower=0
        count_upper=0
        for i in a:
            if i.islower():
                count_lower+=1
            elif i.isupper():
                count_upper+=1
        return count_upper,count_lower
print(getstr('ehllo WROLD'))

在这里插入图片描述

案例3:
    编写函数, 接收一个列表(包含30个整形数)和一个整形数k, 返回一个新列表.
    函数需求:
        - 将列对应(不包含k)表下标k之前的元素逆序;
        - 将下标k之后的元素逆序;
代码:
def getlist(li,k):
    li1=li[:k]
    li2=li[k+1:]
    li[:k]=li1[::-1]
    li[k+1:]=li2[::-1]
    return li
print(getlist([0,1,2,3,4,5,6,7,8,9],5))

在这里插入图片描述

14_函数练习04

模拟轮盘抽奖游戏
轮盘分为三部分: 一等奖, 二等奖和三等奖;
轮盘转的时候是随机的,
      如果范围在[0,0.08)之间,代表一等奖,
      如果范围在[0.08,0.3)之间,代表2等奖,
      如果范围在[0, 1.0)之间,代表3等奖,

模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.
代码:
import random

rewardDict = {
    '一等奖': (0, 0.08),
    '二等奖': (0.08, 0.3),
    '三等奖': (0.3, 1),
}

def rewardFun():
    """用户得奖等级"""
    # 生成一个0~1之间的随机数
    number = random.random()
    # 判断随机转盘转的数是几等奖?
    for k, v in rewardDict.items():
    # 这里的v是元组
        if v[0] <= number < v[1]:
            return k


# print(rewardFun())

resultDict = {}

for i in range(1000):
    # res: 本次转盘的等级(一等/二等/三等)
    res = rewardFun()
    if res not in resultDict:
        resultDict[res] = 1
    else:
        resultDict[res] = resultDict[res] + 1

for k, v in resultDict.items():
    print(k, '---->', v)

在这里插入图片描述

15_综合练习

# 学生管理系统, 分为管理员登陆和学生登陆;
# 管理员登陆, 可以操作:
    # 管理员密码修改;
    # 添加学生的信息;
    # 删除学生的信息;
    # 修改学生的信息;
    # 查询学生的信息(根据学号);
    # 查看所有学生的信息;
    # 退出系统;
# 学生登录:
    # 查询个人信息;
    # 修改信息;
        # 修改年龄;
        # 修改密码;
# 学生信息包括:
    # 学号, 姓名, 性别, 班级, 出生年月, 用户名, 密码
    # 学生用户名和学号保持一致;
# 管理员信息包括:
#     用户名, 密码
代码:
AdminDict={'root':'redhat'}	##管理员用户名和密码
StudentDict={'学号':[],
             '姓名':[],
             '性别':[],
             '班级':[],
             '出生年月':[],
             '用户名':[],
             '密码':[]
             }
def adminsys():			##管理员系统函数
    while True:
        admininfo="""
                1.管理员密码修改
                2.添加学生信息
                3.删除学生信息
                4.修改学生信息
                5.查询学生信息(根据学号)
                6.查看所有学生的信息
                7.退出系统
        """
        print('管理员系统'.center(50,'*'))
        print(admininfo)
        choice=input('输入选项:')
        if choice=='1':
            inpasswd=ip=input('输入新密码:')
            AdminDict['root']=inpasswd
            print('密码修改成功')
        elif choice=='2':
            num=input('输入学号:')
            name=input('输入姓名:')
            sex=input('输入性别:')
            classes=input('输入班级:')
            birth=input('输入出生年月:')
            passwdstudent=input('输入密码:')
            StudentDict['学号'].append(num)
            StudentDict['姓名'].append(name)
            StudentDict['性别'].append(sex)
            StudentDict['班级'].append(classes)
            StudentDict['出生年月'].append(birth)
            StudentDict['用户名'].append(num)
            StudentDict['密码'].append(passwdstudent)
            print('学生信息添加成功')
        elif choice=='3':
            num=input('输入要删除的学号:')
            if num in StudentDict['学号']:
                item=StudentDict['学号'].index(num)
                for i in StudentDict:
                    StudentDict[i].pop(item)
                print('学生信息删除成功')
            else:
                print('学号不存在,不能删除')
        elif choice=='4':
            num=input('输入要修改的学号:')
            if num in StudentDict['学号']:
                option=input('输入要修改的选项:')
                contain=input('输入修改的内容:')
                stem=StudentDict['学号'].index(num)
                StudentDict[option][stem]=contain
                print('学生信息修改成功')
            else:
                print('学号不存在,不能修改')
        elif choice=='5':
            num=input('输入要查询的学号:')
            if num in StudentDict['学号']:
                stem=StudentDict['学号'].index(num)
                for i,v in StudentDict.items():
                    print(i,':',v[stem])
        elif choice=='6':
            for i,v in StudentDict.items():
                print(i,':',v)
        elif choice=='7':
            print('退出成功')
            break
        else:
            print('选项输入错误,请重试')
def studentsys(item):			##学生系统函数
    while True:
        info="""
                1.查询个人信息
                2.修改信息
                    1)修改出生年月
                    2)修改密码
                3.退出系统
        """
        print( '学生系统'.center(50,'*'))
        print(info)
        choice=input('输入选项:')
        if choice=='1':
            for key in StudentDict:
                print('%s:%s' %(key,StudentDict[key][item]))
        elif choice=='2':
            option=input('输入修改选项:')
            if option=='1':
                age=input('输入要修改的出生年月:')
                StudentDict['出生年月'][item]=age
                print('出生年月修改成功')
            elif option=='2':
                passwd=input('输入要修改的密码:')
                StudentDict['密码'][item]=passwd
        elif choice=='3':
            print('退出成功')
            break
        else:
            print('输入错误,请重试')
def main():		##主函数
    while True:
        info="""
                1.管理员登陆
                2.学生登陆
                3.退出登陆
        """
        print('登陆页面'.center(50,'*'))
        print(info)
        choice=input('输入选项:')
        if choice=='1':
            inadmin=input('输入管理员用户名:')
            inpasswd=input('输入密码:')
            if inadmin in AdminDict:
                if inpasswd==AdminDict[inadmin]:
                    adminsys()
                else:
                    print('密码错误')
            else:
                print('管理员用户名错误')
        elif choice=='2':
            instuname=input('输入学生用户名:')
            instupasswd=input('输入密码:')
            if instuname in StudentDict['用户名']:
                item=StudentDict['用户名'].index(instuname)
                if instupasswd==StudentDict['密码'][item]:
                    studentsys(item)
                else:
                    print('密码错误')
            else:
                print('学生用户名错误')
        elif choice=='3':
            print('退出成功')
            break
        else:
            print('输入错误,请重试')
main()			##调用主函数
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值