初识函数

初识函数

  • 1. 什么是函数
  • 2. 函数定义, 函数名, 函数体以及函数的调用
  • 3. 函数的返回值
  • 4. 函数的参数

1.函数

     定义一个事情或者功能. 等到需要的时候直接去用就好了. 那么这里定义的东西就是⼀个函数.           函数: 对代码块和功能的封装和定义

 2.函数的定义, 函数名, 函数体以及函数的调用

      使用def关键字来定义函数, 函数的定义语法:

def 函数名():    
    函数体

    函数名的命名规则和使用和变量基本⼀样(变量的命名规则),     函数体: 就是函数被执行之后要执行的代码

def back():
    print("网上订票")
    print("坐火车回家")
    print("路上睡觉")

    定义完了. 但是这个时候去执行. 会发现什么都没有发生.  因为我只定义了⼀个函数. 但是还没有执行过这个函数.

    函数的调用: 使用函数名可以调用函数, 写法: 函数名(), 这个时候函数的函数体会被执行

def back():
    print("网上订票")
    print("坐火车回家")
    print("路上睡觉")
back()                  #调用函数)

  3.函数返回

      执行完函数之后. 使用return来返回结果. 

     函数中return的使用:

     函数中遇到return, 此函数结束, 不再继续执行.

def back():
    print("网上订票")
    print("坐火车回家")
    returnprint("路上睡觉")            #不会被执行
back()

     给函数的调用者⼀个访问结果

def back():
    print("网上订票")
    print("坐火车回家")
    print("路上睡觉")
    return "就是太慢了"
think=back()
print(think)

    函数返回值可以有多个结果

def back():
    print("网上订票")
    print("坐火车回家")
    print("路上睡觉")
    return "就是太慢了","有时候票也不好买","但是相对便宜"
think=back()
print(think)      #('就是太慢了', '有时候票也不好买', '但是相对便宜')   tuple

总结⼀下:

  • 1. 遇到return. 此函数结束, 函数后面的东西将不会再执行
  • 2. return 返回值       

        关于返回值:           

  • 如果return什么都不写 或者干脆不写return .那么返回的就是None           
  • 如果return后面写了⼀个值. 则调用者可以接收⼀个结果           
  • 如果return后面写了多个结果, 则调用者可以接收⼀个tuple, 调用者可以直接解构成多个变量

4.函数的参数

    参数, 函数在调用的时候指定具体的⼀个变量的值. 就是参数.  语法:

def 函数名(参数列列表):   
     函数
def back(ways):
    print("网上订票")
    print("坐%s回家" % ways)
    print("路上睡觉")
back("汽车")
back("火车")
back("飞机")

   关于参数: 

  •   形参:写在函数声明的位置的变量叫形参.  形式上的⼀个完整. 表示这个函数需要xxx
  •   实参:在函数调⽤用的时候给函数传递的值. 叫实参, 实际执行的时候给函数传递的信息. 表⽰示给函数 xxx
  •   传参:给函数传递信息的时候将实际参数交给形式参数的过程被称为传参.

  (1)参数的分类--实参的分类

     位置参数:在访问back()的时候, 按照位置的顺序分别把"携程", "火车", 6小时 赋值给 search, ways, time. 在传参过程中. 系统会默认按照位置把实参赋值到形参.   

 

def back(search,ways,time):
    print("打开%s进行查找"%search)
    print("坐%s回家" % ways)
    print("路上需要睡%s" %time)
back("携程","火车","6小时")

打开携程进行查找
坐火车回家
路上需要睡6小时

 

 练习: 编写函数, 给函数传递两个参数a, b. 比较a, b的大小, 返回 a, b中大的那个数  

def my_max(a, b):   
     if a > b:     
          return a    
    else:       
          return b
 # 有点⼉儿麻烦, 我们在这⾥里里学一个三元运算符. 
def my_max(a, b):    
     c = a if a > b else b   # 当a>b成⽴立返回a, 否则返回b   
     return c            

关键字参数:函数在定义的时候参数非常多时,我们不需要记住每个参数的位置. 只要记住每个参数的名字就可以了了 

def back(search,ways,time):
    print("打开%s进行查找"%search)
    print("坐%s回家" % ways)
    print("路上需要睡%s" %time)
back(ways="火车",search="携程",time="6小时")
打开携程进行查找
坐火车回家
路上需要睡6小时

 混合参数: 可以把上面两种参数混合着使用. 也就是说在调用函数的时候即可以给出位置参数, 也可以指定关键字参数

def back(search,ways,time):
    print("打开%s进行查找"%search)
    print("坐%s回家" % ways)
    print("路上需要睡%s" %time)
back("携程",ways="火车",time="6小时") #正确 第一个位置赋值给search,后面的参数开始制定关键字
def back(search,ways,time):
    print("打开%s进行查找"%search)
    print("坐%s回家" % ways)
    print("路上需要睡%s" %time)
back(search="携程","6小时",ways="火车")   # 错误, 最开始使用了关键字参数, 那么后面的"6小时"的位置就串了,容易出现混乱

注意: 在使用混合参数的时候, 关键字参数必须在位置参数后面

(2)参数的分类--形参的分类

     位置参数:按照位置来赋值, 到⽬目前为⽌止, 我们编写的函数都是这种

     默认值参数:在函数声明的时候, 就可以给出函数参数的默认值. 在调用的时候可以 给出具体的值, 也可以不给值, 使用默认值.

      比如, 我们录入咱们班学生的基本信息. 通过调查发现. 我们班大部分学生都是男生. 这个时候就可以给出⼀个sex='男'的默认值.

def stu_info(name, age, sex=''):
    print("录⼊入学⽣生信息")
    print(name, age, sex)
    print("录⼊入完毕")
stu_info("张强强", 18)

注意, 必须先声明位置参数, 才能声明默认值参数.

Homework

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

def func(lst):   # function
    return lst[1::2]
    # result = []
    # for i in range(len(lst)):
    #     if i % 2 == 1:
    #         result.append(lst[i])
    # return result                        #很明显代码量大
ret=func([1,2,5,8,7])
print(ret)

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

def func(obj):
    # if len(obj) > 5:
    #     return True
    # else:
    #     return False
    return len(obj) > 5                      #返回结果
print(func("倚天屠龙记张无忌"))

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

def func(lst):
    if len(lst) > 2:
        return lst[:2]

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

def count(info):
    a=0
    b=0
    c=0
    d=0
    for el in info:
        if el.isdigit():
            a+=1
        elif el.isalpha():
            b+=1
        elif el.isspace():
            c+=1
        else:
            d+=1
    return a,b,c,d
ret = count ("ASD78489   __")
print(ret)

5.写函数,接收两个数字参数,返回比较大的那个数字。

def func(a, b):
    # if a > b:
    #     return a
    # else:
    #     return b
    return a if a > b else b          #三目运算

7.写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

       dic = {"k1": "v1v1", "k2": [11,22,33,44]}

       PS:字典中的value只能是字符串或列表

def func(dic):
    for k, v in dic.items():
        if len(v) > 2:
            v = v[:2]
            dic[k] = v
    return dic
print(func({"k1": "v1v1", "k2": [11,22,33,44]}))

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

def stu_info(name,age,education,sex):
    f=open("student_msg",mode="a",encoding="utf-8")
    f.write("%s %s %s %s\n" % (name,age,education,sex))
a = input("请输入学生姓名:")
b = input("请输入学生年龄:")
c = input("请输入学生学历:")
d = input("请输入学生性别:")
stu_info(a,b,c,d )

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

def stu_info(name,age,education,sex=""):
    f=open("student_msg",mode="a",encoding="utf-8")
    f.write("%s %s %s %s\n" % (name,age,education,sex))
    f.flush()
    f.close()
while 1:
    name = input("请输入学生姓名(输入Q退出):")
    if name.upper()=="Q":
        break
    else:
        age = input("请输入学生年龄:")
        education = input("请输入学生学历:")
        sex = input("请输入学生性别(如果是女生则输入女,男生不需要输入,任意键跳过输入):")
        if sex == "":
            stu_info(name,age,education,sex)
        else:
            stu_info(name, age, education)
def func(name, age, edu, gender=""):
    f = open("student_msg", mode="a", encoding="utf-8")
    f.write(name+"_"+gender+"_"+age+"_"+edu+"\n")
    f.flush()
    f.close()
while 1:
    tiwen = input("请问是否要输入学生信息输入任意内容继续,输入Q退出:")
    if tiwen.upper() == 'Q':
        break
    name = input("请输入你的姓名:")
    gender = input("请输入你的性别:")
    age = input("请输入你的年龄:")
    edu = input("请输入你的学历:")
    gender = "" if gender == "" else ""
    func(name, age, edu, gender)

8,写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作。

def revise(name,old,new):
    import os
    with open ("%s" % name,mode="r",encoding="utf-8" )as f1,\
        open ("%s_副本"% name,mode ="w",encoding="utf-8" ) as f2:
        for line in f1:
            New_line = line.replace("%s" % old,"%s" %new)
            f2.write(New_line)
    os.remove("%s"% name)
    os.rename("%s_副本" % name, "%s"% name)
a =input("请输入您要修改的文件名:")
b = input("请输入你要修改的内容:")
c = input("请输入你修改的新内容:")
revise(name=a,old=b,new=c)
import os
def func(file_name, old, new):

    with open(file_name, mode="r", encoding="utf-8") as f1, \
        open(file_name+"_副本", mode="w", encoding="utf-8") as f2:
        for line in f1:
            line = line.replace(old, new)
            f2.write(line)
    os.remove(file_name)
    os.rename(file_name+"_副本", file_name)

12.写一个函数完成三次登陆功能,再写一个函数完成注册功能

def regist(username, password): # wusir
    # 1. 检查用户名是否重复
    f = open("user_info", mode="r+", encoding="utf-8")
    for line in f:
        if line == "": # 防止空行影响程序运行
            continue
        user_info_username = line.split("_")[0]
        if username == user_info_username: # 用户名重复了
            return False
    else:
        # 2. 写入到文件中
        f.write(username+"_"+password+"\n")

    f.flush()
    f.close()
    return True

name, psw = input("请输入你的用户名:"), input("请输入你的密码:")
print(regist(name, psw))

def login(username, password):
    f = open("user_info", mode="r", encoding="UTF-8")
    for line in f:
        if line.strip() == username+"_"+password:
            f.close()
            return True
    else:
        f.close()
        return False

for i in range(2, -1, -1):
    ret = login(input("请输入用户名:"), input("请输入密码:"))
    if ret:
        print("恭喜你. 登录成功")
        break
    else:
        print("用户名或密码错误, 还有%s次机会" % i)

 

posted @ 2018-09-13 15:20  一路向北_听风  阅读(268)  评论(1编辑  收藏  举报