010-2018-09-14 函数进阶

1.今日内容大纲

一. 昨日内容回顾
    1. 函数: 对功能或者动作的封装
        定义:
            def 函数名(参数列表):
                函数体(return)
        调用:
            ret = 函数名(实参列表)
        函数名就是变量名.
        函数名的命名规则: 变量的命名规则;
            1. 数字, 字母, 下划线组成
            2. 不能数字开头, 更不能是纯数字
            3. 不能用关键字
            4. 不要用中文
            5. 不要太长
            6. 要有意义
            7. 区分大小写
            8. 建议使用驼峰或者下划线

    函数的返回值:函数结束执行之后给调用方的结果
        return: 只要函数运行到了return. 函数立即停止执行
        1. 不写return. 默认返回None
        2. 写了return 后面不跟值
        3. return 值  返回一个结果
        4. return 值, 值, 值, 值  返回多个结果. 返回的是元组

    函数的参数:
        1. 形参: 在函数定义的地方的变量
            1. 位置参数
            2. 默认值参数
        2. 实参: 在函数调用的地方给函数传递的具体的值
            1. 位置参数
            2. 关键字参数
            3. 混合参数 先位置. 后关键字
        3. 传参: 把实参赋值给形参的过程叫传参

二. 作业讲解
三. 今日主要内容
    1. 动态传参
        形参:
            1. 位置参数
            2. 默认值参数
            3. 动态传参
                *args 动态接收位置参数
                **kwargs 动态接收关键字参数
                def func(*args, **kwargs):
                在形参上用*,** 表示聚合. 实参表示打散

                顺序:
                    位置 *args 默认值 **kwargs

    2. 作用域
        名称空间:
            1. 内置
            2. 全局
            3. 局部

            作用域:
            1. 全局作用域: 内置+全局
            2. 局部作用域: 局部

            globals() 查看全局作用域中的内容
            locals()  查看当前作用域中的内容

    3. global nonlocal
        global:  在局部引入全局变量
        nonlocal:  在局部, 引入离他最近的那一层的变量

    复习:
        平时作业 + 课上代码
    预习:
        1. 函数名的应用.
        2. 闭包.
        3. 迭代器.

2.练习

'''
day9 作业及默写
1,整理函数相关知识点,写博客。

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

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

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

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

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

7,写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
	dic = {"k1": "v1v1", "k2": [11,22,33,44]}
	PS:字典中的value只能是字符串或列表

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

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

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

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

12,写一个函数完成三次登陆功能,再写一个函数完成注册功能(升级题)
明日默写。
①,return的作用。
②,传参的几种方法,每个都简单写一个代码。
如,实参,按位置传参。
def func(x,y):
Pass
func(‘a’,’b’)

'''

# 2,写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
# 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

# 3, 写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5
# def func(obj):
#     # if len(obj) > 5:
#     #     return True
#     # else:
#     #     return False
#     return len(obj) > 5


# 4, 写函数,检查传入列表的长度,如果大于2,将列表的前两项内容返回给调用者
# def func(lst):
#     if len(lst) > 2:
#         return lst[:2]


# 5, 写函数,计算传入函数的字符串中, 数字、字母、空格 以及 其他内容的个数,并返回结果 isalpha()
# def func(s=""):
#     shuzi = 0
#     zimu = 0
#     kongge = 0
#     qita = 0
#     for c in s:
#         if c.isalpha():
#             zimu = zimu + 1
#         elif c.isdigit():
#             shuzi = shuzi + 1
#         elif c.isspace():
#             kongge = kongge + 1
#         else:
#             qita = qita + 1
#     return shuzi, zimu, kongge, qita
#
# print(func("abcd1234@@@@    "))

# 6,写函数,接收两个数字参数,返回比较大的那个数字。
# def func(a, b):
#     # if a > b:
#     #     return a
#     # else:
#     #     return b
#     return a if a > b else b

# 三目运算
# a = 100
# b = 20
#
# c = a if a > b else b
# print(c)

# 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

# 8, 8,写函数,此函数只接收一个参数且此参数必须是列表数据类型,
# 此函数完成的功能是返回给调用者一个字典,
# 此字典的键值对为此列表的索引及对应的元素。
# 例如传入的列表为:[11,22,33] 返回的字典为 {0:11,1:22,2:33}。
# def func(lst):
#     if type(lst) != list:
#         print("扔出去一个异常")
#
#     dic = {}
#     for i in range(len(lst)):
#         dic[i] = lst[i]
#     return dic

# 写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。用户通过输入这四个内容,
# 然后将这四个内容传入到函数中,此函数接收到这四个内容,
# 将内容追加到一个student_msg文件中
# 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()
#
# # func("郑中基", "男", "50", "大本")
# # func("张学友", "男", "60", "大本")
#
# 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)

# 11 写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作(升级题)。
# 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)

tuple()

3.动态传参

# def chi(*food): # * 表示的是不定参数. 可以传递任意个信息 参数名是food, 接受到的是元组
#     print("我要吃", food)
#
# chi("一锅大米饭", "一箱辣条", "一桶方便面", "4L可乐")
# chi("方便面")
# chi("一大锅米饭", "一小锅小米饭", "一箱辣条", "一桶方便面", "4L可乐")

# * 表接收位置参数的动态传参
# 传参的顺序
# 位置 *args 默认值 **kwargs
#
# 如果默认值参数在*args前面. 如果想让默认值生效. *args将永远接不到值
# def func( a, b, *args,c = 5): # arguments参数
#     print(a, b, c, args)
#
# func(1,2,3,4,5,6,8,c = 10)

# 关键字的动态传参
# *args 位置参数 接收到的是元组
# **kwargs 关键字的动态传参, 接收到的是字典
# def func(**kwargs): # key word arguments
#     print(kwargs)
#
# func(a=10, b=20, jay="周杰伦", jj="林俊杰")

# 无敌模式. 所有的参数都能接收
# def func(*args, **kwargs):
#     print(args)
#     print(kwargs)
#
# func(1, 2, 5, jj="陶喆", jay="zhoujielun", soup="胡辣汤")

# def func(*args): # 在这里. 其实相当于把传进来的参数做了一次聚合, 聚合成一个元组
#     print(args)
#
# lst = "娃哈哈"
# func(*lst) #  在实参位置 * 表示打散, 打散的是可迭代对象


# def func(**kwargs): # ** 把接收到的关键字参数打包(聚合)成字典
#     print(kwargs) # 一定是字典
#
# dic = {"张无忌": "明教教主", "谢逊": "金毛狮王", "范瑶": "光明右使"}
#
# # func(张无忌=dic['张无忌'], 谢逊=dic['谢逊'], 范瑶=dic['范瑶'])
# func(**dic) # 这里的** 是把字典打散. 字典的key作为参数的名字, 字典的值作为参数的值传递给形参

# 在形参上
#   1. 位置参数
#   2. 默认值参数
#   3. 动态参数
#       1. *args  位置参数的动态传参. 系统会自动的把所有的位置参数聚合成元组
#       2. **kwargs  关键字的动态传参. 系统会自动把所有的关键字参数聚合成字典
#       3.  def func(*args, **kwargs): 无敌传参
#       4. 顺序:  位置参数, *args, 默认值, **kwargs
#       5. 在使用的时候, 可以任意的进行搭配
#   4. 在实参上. *, **表示的打散.  在形参. *,** 表示聚合

4.名称空间

# 最开始会开辟一个自己的命名空间- 内置名称空间
# a = 10
# print(a)
# # 直接在py文件一个层面上是全局名称空间
# def func():
#     hasakey = 10
# # 在函数内部属于局部名称空间
# func()
# 加载顺序: 内置 => 全局 => 局部
# 取值顺序: 局部 => 全局 => 内置

# a = 10 # 全局
# def func():
#     # a = 20
#     print(a)
#
# func()

# 作用域: 变量或者函数的声明周期
# 全局作用域: 全局名称空间+内置名称空间
# 局部作用域: 局部名称空间
# a = 10 # 全局
# def func():
#     liuwei = "刘伟"

# 1. globals() 查看全局作用域中的所有内容
# qiao = "乔峰"
# def 抗收音机():
#     bgm = "难念的经"
#     print("娃哈哈")
#     print(locals())
# 抗收音机()

# # print(globals()) # 查看全局作用域中的内容
# # print(locals()) # locals()查看的是当前作用域中的内容

5.函数掐套

# def func1():
#     print("我是func1")
#
# def func2():
#     print("我是func2")
#     func1()
#
# def func3():
#     func2()
#     print("我是func3")
# func3()
# 这样的代码不是嵌套. 互相调用

# 函数可以互相嵌套
# def outer():
#     def inner():
#         print("我是内部")
#     print("我是外部")
#     inner()
#
# outer()

# def outer():
#     print("我是外面的")
#     def inner_1():
#         def inner_2():
#             print("我是里面的2")
#         inner_2()
#         print("我是里面的1")
#     inner_1()
#     print("我是外面的收尾")
#
# outer()

# a = 10
# def func():
#     global a #表示在当前作用域中的使用的a是全局中的变量
#     a = 20 # 所有的a都是外面的了
#     print(a) # 现在只有看的权利
#
# print(a) # 10
# func() # 20
# print(a) # 20


# def outer():
#     a = 10
#     def inner():
#         nonlocal a # 找的是局部当中, 离他最近的上层的那个变量
#         a = 20
#         print(a)
#     print(a) # 10
#     inner() # 20
#     print(a) # 20
# outer()



# a = 1
# def fun_1():
#     a = 2
#     def fun_2():
#         nonlocal a
#         a = 3
#         def fun_3():
#             a = 4
#             print(a)
#         print(a)
#         fun_3()
#         print(a)
#     print(a)
#     fun_2()
#     print(a)
# print(a)
# fun_1()
# print(a)

# global 引入全局变量, 可以定义全局变量
# nonlocal 引入局部中离他最近的外层变量

# def func():
#     global a # 没有也得有. 自动帮你创建
#     a = 20
#
# func()
# print(a)

6.其他

student_msg:
郑中基_男_50_大本
张学友_男_60_大本
刘德华_男_60_大本、
关之琳_女_60_大本

user_info:
alex_123456
wusir_456789
taibai_789123
sylar_779991


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值