1.函数

         对代码块和功能的封装和定义,即对某个功能直接进行封装,当需要该功能时,直接调用函数

1)函数的定义

def 函数名():

         函数体

2)函数调用:

函数名()

例:函数的定义和调用

def play():         #函数定义
    print("吃饭")
    print("睡觉")
    print("打豆豆")
play()          #函数调用
print("哈哈哈哈")
play()
View Code

3)函数的返回

         执行完函数之后,可以使用return来返回结果

def play():         #函数定义
    print("吃饭")
    print("睡觉")
    print("打豆豆")
    return "吃喝玩乐"      #当函数结束的时候,给调用方一个结果
res = play()   #函数调用,并接受返回结果
print(res)
输出:
吃饭
睡觉
打豆豆
吃喝玩乐
View Code

①每个函数如果在函数中不写return,默认返回None

②如果在return后面啥也不写,默认也是返回None

③只要函数执行到return,函数就会停止执行

④可以只写一个return,也是返回None,表示停止函数的执行

⑤return 一个返回值 ;  可在调用方接受到一个返回值

⑥return 多个返回值  ; 多个返回值需要用逗号隔开,多个返回值在接受的位置,接受到的时元组类型的数据

def play():         #函数定义
    print("吃饭")
    print("睡觉")
    print("打豆豆")
res = play()   #函数调用,并接受返回结果
print(res)
输出:
吃饭
睡觉
打豆豆
None
View Code

#函数存在多个返回值

def play():         #函数定义
    print("打豆豆")
    return "吃饭","睡觉","玩游戏"
a,b,c = play()
print(a)
print(b)
print(c)
输出:
打豆豆
吃饭
睡觉
玩游戏
View Code

4)函数的参数

         参数:在函数执行的时候,给函数传递的信息

         形参:在函数声明的位置,声明出来的遍历

         实参:在函数调用的时候实际给函数传递的值

def play(func):         #func为形参
    print("吃饭")
    print("打%s" % func)
play("游戏")
play("豆豆")           #实参
View Code

#可以给函数传递多个参数,每个参数之间用逗号隔开 

def play(func,game):         #函数定义
    print("吃饭")
    print("玩%s" % func)
    print("游戏名称为 %s" % game)
play("游戏","LOL")
输出:
吃饭
玩游戏
游戏名称为 LOL
View Code

注:函数的参时个数是没有要求的,但是程序在运行的时候,要按照位置把实参赋值给形参

#实参的角度,对于参数的分类:

①位置参数

②关键字参数

③混合参数:混合参数应注意书写顺序,先写位置参数,然后在写关键字参数,否则会报错

def people(id,name,age,add,email):
    print("ID:%s,姓名:%s,年龄:%s,地址:%s,邮箱:%s" % (id,name,age,add,email))
people("101","zz","23","兰州","88888@qq.com")  #位置参数
people(name="ha",age="20",add="西安",id="102",email="00000@163.com")  #关键字参数
people("103",name="er",age="4",add="lanzhou",email="1dada00@163.com")  #混合参数
输出:
ID:101,姓名:zz,年龄:23,地址:兰州,邮箱:88888@qq.com
ID:102,姓名:ha,年龄:20,地址:西安,邮箱:00000@163.com
ID:103,姓名:er,年龄:4,地址:lanzhou,邮箱:1dada00@163.com
View Code

#形参的角度,对于参数的分类

①位置参数

②默认值参数:在定义时,给形参一个默认值,实参传值时,若不写,使用默认值

③位置参数和默认值参数混和用。顺序:先写位置参数,然后再写默认值参数

#默认值参数使用

def people(name,age,sex=""):
    print("姓名:%s,年龄:%s,性别: %s" % (name,age,sex))
people("张三",18)
people("李四",20)
people("小红",23,"")
输出:
姓名:张三,年龄:18,性别: 男
姓名:李四,年龄:20,性别: 男
姓名:小红,年龄:23,性别: 女
View Code

 例1:1+。。。。+n

def sum(n):
    s = 0
    count =1
    while count <= n:
        s = s + count
        count = count +1
    return s
res = sum(100)
print(res)
输出:
5050
View Code

例2:计算n是奇数还是偶数

def fn(n):
    if n%2 ==0:
        return "偶数"
    else:
        return "奇数"
print(fn(321))
输出:
奇数
View Code

 2.练习

1)写一个函数,检查获取传入列表或元组对象(即传入的参数为列表或者元组)的所有奇数位索引对于的元素,并将其作为新列表返回给调用者

def func(lst):
    lst_new =[]
    for i in range(len(lst)):
        if i % 2 == 1:
            lst_new.append(lst[i])
    return lst_new
a = [1,10,13,2,8,17]
s = func(a)
print(s)
输出:
[10, 2, 17]
View Code

2)写一个函数,判断用户传入的对象(字符串,列表,元组)长度是否大于5

注:对于判断类的函数,返回值建议写True或者False

def func(a):
    if len(a) >5:
        return True
    else:
        return False
res = func("我爱北京天安门")
print(res)
输出:
True
View Code

3)写一个函数,检查传入列表的长度,如果列表长度大于2,将列表的前2项返回给调用者

def func(lst):
    if len(lst) > 5:
        return  lst[0],lst[1]
a,b = func(lst=[10,20,5,8,7,9,6])
print(a,b)
输出:
10 20 
View Code

4)写一个函数,计算传入函数的字符串中的数字,字母,空格,以及其他内容 的个数,并返回结果

def func(s=""):
    num = 0
    word =0
    space =0
    other = 0
    for i in s:
        if i.isdigit():
            num +=1
        elif i.isalnum():
            word += 1
        elif i == " ":
            space += 1
        else:
            other +=1
    return  num,word,space,other
str = "AAAA2222  @@  #"
print(func(str))
输出:
(4, 4, 4, 3)
View Code

5)写一个函数,接受两个参数,返回比较大的那个数字

def func(a,b):
    return a if a>b else b
print(func(3,5))
输出:
5
View Code

6)写一个函数,检查传入字典的每一个value的长度,如果value的长度大于2,那么仅保留前两个长度的内容,并将新内容返回给调用着(注:字典中的value只能是字符串或列表)

如dic={'k1':"vvvv",'k2':[11,22,33,44]} 改变为dic={'k1':"vv",'k2':"[11,22]"}

def func(dic):
    dic_new = {}
    for k,v in dic.items():
        if len(v) > 2:
            dic_new[k] = v[0:2]
        else:
            dic_new[k] = v
    return dic_new
dic={'k1':"vvvv",'k2':[11,22,33,44]}
print(func(dic))
输出:
{'k1': 'vv', 'k2': [11, 22]}
View Code

7)写一个函数,此函数只接受一个参数且参数必须是列表数据类型,此函数完成的功能是返回调用者一个字典,此字典的键值对位此列表的索引以及对于的元素。例如传入的列表为[11,22,33]则返回的字典为{0:11,1::22,2:33}

def func(lst):
    dic = {}
    for i in range(len(lst)):
        dic[i] = lst[i]
    return dic
lst = ["哈哈","呵呵","吼吼"]
print(func(lst))
输出:
{0: '哈哈', 1: '呵呵', 2: '吼吼'}
View Code

8)写一个函数,函数接受四个参数分别为:姓名、性别、年龄、学历。用户通过输入这四个内容,然后将这四个内容传入到函数中,此函数接受到这四个内容,将内容追加到一个student_msg文件中

def funn(name,sex,age,edu):
    f = open("student.msg",mode="a",encoding="utf-8")
    f.write(name+"_"+sex+"_"+"_"+age+"_"+edu)
    f.flush()
    f.close()
    return name,sex,age,edu
a = input("请输入姓名:")
b = input("请输入性别:")
c = input("请输入年龄:")
d = input("请输入学历:")
print(funn(a,b,c,d))
输入输出:
请输入姓名:zdz
请输入性别:男
请输入年龄:20
请输入学历:小学
('zdz', '', '20', '小学')
View Code

9)对上一题升级:支持用户持续输入,按Q或者q退出,性别默认为男,如果遇到nv学生,则把性别输入女

def funn(name,age,edu,sex=""):
    f = open("student.msg",mode="a",encoding="utf-8")
    f.write(name+"_"+sex+"_"+"_"+age+"_"+edu+"\n")
    f.flush()
    f.close()
    return name,sex,age,edu
while 1 :
    content = input("是否录入学生信息,Q/q退出:")
    if content.upper() == "Q":
        break
    a = input("请输入姓名:")
    b = input("请输入性别:")
    c = input("请输入年龄:")
    d = input("请输入学历:")
    funn(a,b,c,d)
View Code

10.写一个函数,用户掺入修改的文件名与要修改的内容,执行函数,完成整个文件的批量修改操作

import  os
def func(filename,old,new):
    with open(filename,mode="r",encoding="utf-8") as f1, \
        open(filename+"_副本",mode="w",encoding="utf-8") as f2:
        for line in f1:
            s = line.replace(old,new)
            f2.write(s)
    os.remove(filename)
    os.replace(filename+"_副本",filename)
func("student.msg","小学","大学")
View Code