昨日回顾

1.函数:

函数的定义

函数的参数

  • 位置参数
  • 关键字参数
  • 混合参数
  • 形参的位置上(默认参数)
  • 实参的位置上(关键字参数)
  • 位置参数 > 默认参数

三元运算符:

c = a if a>b else b

函数的返回值:

  1. 没有写return 返回的是None
  2. 写了return 没写返回值也是None
  3. 写了一个值是它本身,多个返回的是一个元组
  4. return 下面的代码不执行
  5. 当函数执行到return就结束这个函数

返回值返回给调用者?? 函数名+() 就是调用者

传参: 将实参传递给形参的过程

函数执行流程:

  1. 定义函数
  2. 开辟内存
  3. 调用函数
  4. 执行函数体
  5. 销毁函数开辟的内存
li = [1,23]
def func(li):
    print(li)  #'啊啊啊'

func('啊啊啊')

def func(argv):
    argv = 123
    print(argv)
    pass

func(123)

作业讲解:

7.写函数,检查传入字典的每一个value的长度,如果大于2,

那么仅保留前两个长度的内容,并将新内容返回给调用者。

 dic = {"k1": "v1v1", "k2": [11,22,33,44]}
 PS:字典中的value只能是字符串或列表
 dic={"k1": "v1v1", "k2": [11, 22, 33, 44]}
 def aaa(d):
     for k,v in d.items():
         if len(v) > 2:
             d[k] = v[0:2]
     return d
 ret = aaa(dic)
 print(ret)
 print(dic)
import os

9.写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。

用户通过输入这四个内容,然后将这四个内容传入到函数中,

此函数接收到这四个内容,将内容追加到一个student_msg文件中。

 def s(name,sex,age,level):  # 形参 接受
     with open('student_msg','a',encoding='utf-8')as f:
         f.write(f'{name},{sex},{age},{level}\n')

 name = input('name:')
 sex = input('sex:')
 age = input('age:')
 level = input('level:')
 s(name,sex,age,level) # 实参 传入

格式化字符串方法

3种:

%
fromat

f
name = '粉葛'
a = f'{name},你好'
%s
s = '请输入内容:'

def s(name,sex,age,level):  # 形参 接受
    sex='男' if sex == '' else sex
    with open('student_msg','a',encoding='utf-8')as f:
        f.write(f'{name},{sex},{age},{level}\n')

def q(name): # 名字,性别,年龄
    if name.upper() == 'Q':
        exit()

flag = True
while flag:
    name = input('name(Q/退出):')
    q(name)
    sex = input('sex(Q/退出)[男性直接回车]:')
    q(sex)
    age = input('age(Q/退出):')
    q(age)
    level = input('level(Q/退出):')
    q(level)
    s(name,sex,age,level) # 实参 传入

11.写函数,用户传入修改的文件名,

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

def func(file_name,old,new):

    with open(file_name,'r',encoding='utf-8')as f,\
        open(f'new_{file_name}','w',encoding='utf-8')as f1:
        for line in f:
            line = line.replace(old,new)
            f1.write(line)
    os.remove(file_name)
    os.rename(f'new_{file_name}',file_name,)

func('student_msg','sb','alex')

alt + 回车

动态参数

def func(): # 形参
    pass

func() # 实参

def func(a,b,c,*args):  # 在形参位置*叫做聚合
    print(a,b,c)
    print(args)   # 元组形式

func(1,2,3,4,5,9,6,7,8)

位置参数 > 动态的位置参数

def func(**kwargs): # 动态默认参数  #形参的时候**聚合
    print(kwargs)  # 字典

func(a=1,b=2,c=3) # 关键字的形式传参

def func(a,b,c,*args,x=1,y=1,z=1,**kwargs):
     print(a,b,c)
     print(args,kwargs)
     print(x, y, z)
     # 1 2 3
     # (1,2,3,4,5)
     # 1 1 1
     # {'a': 1, 'b': 1, 'c': 1}
func(1,2,3,4,e=1,f=2,g=3)

def func(a,b,c,*args,x=1,y=1,z=1,**kwargs):
     print(a,b,c) # 123
     print(args,kwargs) # () {}
     print(x, y, z) #1 1 1
     # 1 2 3
     # (1,2,3,4,5)
     # 1 1 1
     # {'a': 1, 'b': 1, 'c': 1}
func(1,2,3,4,a=1,b=2,c=3)

def func(*args,**kwargs):
     print(args,kwargs) # args = () kwargs = {}
func(1,2,3,a=4,b=5)

def func(*args,**kwargs):
     print(args,kwargs) # args = () kwargs = {'a':4,'b':5}
func(a=4,b=5)

def func(*args,**kwargs):
     print(args,kwargs) # args = (1,2,3) kwargs = {}
func(1,2,3)

def func(*args,**kwargs): # * 聚合
     print(*args) # args = ()  *args = 1 2 3 *打散
     print(*kwargs) # args = ()  **kwargs = 1 2 3 *打散 字典的键
func(1,2,3,a=4,b=5)

li = [1,2,3,5,4]

def func(*args):  # 聚合 (1,2,3,5,4)
    print(args)
    print(*args)  # 打散 1,2,3,5,4
func(*li)         # 1,2,3,5,4

def func(*args,**kwargs):  # 聚合 (1,2,3,5,4)
    print(args,*kwargs)    # print('a','b')
func(**dic)                # 1,2,3,5,4

dic = {'a':1,'b':2}
def func(*args,**kwargs):  # 聚合 (1,2,3,5,4)
    print(args,*kwargs)   # a=1,b=2
func(*[1,2,3])                # func(a=1,b=2)

print('a','b')
print(a=1,b=2)
li = [1,2,3,4]

args和 kwargs 是可以更换的,但是程序员约定都用它

用途:

  • 在不明确接受参数,数量时使用*args和**kwargs
  • 动态位置参数 > 动态关键字参数
  • 形参: 位置 > 动态位置 > 默认参数 > 动态默认参数
  • 实参: 位置 > 关键字参数
  • 在实参调用的时候 *将可迭代的对象打散,字典是将键取出
  • 在形参处出现*就是在聚合
  • 在实参调用的时候 **将字典打散成 关键字参数(键=值)
  • 在形参处出现**就是将关键字参数聚合成一个字典
def func(a,**kwargs):
    print(a)
    # **kwargs # a=1,b=2
    b = **kwargs
func(**{'a':1})  # func(a=1)

函数的注释

def aaa(user,pwd):
    """
    登录函数
    :param user: 用户名
    :param pwd: 密码
    :return: 校验后的账号和密码
    """
    print(111)

print(aaa.__doc__)

简单了解
print(aaa.__name__) # 反射

名称空间

  1. 内置空间中所有代码 -- 内置空间
  2. 自己写的py文件 -- 全局空间
  3. 函数中的代码 -- 局部空间
a = 10
def func():
    print(a)
func()

加载顺序:

  1. 内置空间
  2. 全局空间
  3. 局部空间

取值顺序:

  1. 局部空间
  2. 全局空间
  3. 内置空间
  4. 找不到就报错

作用域:

  1. 全局作用域 内置+全局 = 全局作用域
  2. 局部作用域 函数内的就是局部作用域
a = 10
def func():
    global a  # (声明)我要修改a 找到要a
    a+=1      # 修改
func()
print(a)

def func():
    global a  #(声明我要修改a,找不到a的时候在全局创建一个 a=0)
    a = 1  # a = 1
func()
print(a)
 ```

##函数的嵌套
###第一种函数嵌套 在函数func内
```python
def func():
    print(3)
    def f():
        print(1)
    print(2)
    f()
func()

第二种函数嵌套 多个函数嵌套调用

def func2():
    print(1)
    log()

def func1():
    print(3)

def log():
    func1()
    print(6)
    def fun():
        print(7)

def func():
    a = 1
    def log():
        a = 5
        def info():
            a = 10
            print(a)
        print(a)
    print(a)
func()

def func():
    a = 1
    def log():
        a = 5  # a = 15
        def info():
            nonlocal a # 声明修改log函数下边的变量a
            a += 10   # a = a + 10  a = 15
            print(a)  # 15
        info()
        print(a)  # 15
    log()
    print(a)  # 1
func()

在一个局部空间内,nonlocal会修改离他最近的那个变量,如果上一层

没有就继续向上找,直到走到局部空间头部

def f():
    def a1():
        def l():
            nonlocal a
            a = 8
            print(a)
        l()
    print(a1())
f()

global : 在局部修改全部变量,如果没有就创建一个新的

nonlocal : 在局部空间内,修改离自己最近的变量,如果上一层没有就继续向上找,

直到找到局部变量的顶层,局部空间内没有可以修改的变量,就报错

今日总结

函数的进阶:

1.1 动态参数
位置参数 > 动态位置参数 > 默认参数 > 动态(关键字)默认参数
1.2 ,*
在实参位置是打散
在形参位置是聚合
1.3 args,*kwargs 可以修改,但是不建议修改
1.4 将(列表,元组,字符串,字典,集合)打散传入

2.1 函数的注释:
""" """ 官方推荐
查看注释: func名.__doc__
查看注释: func名.__name__

3.1 名称空间
加载顺序:
1.内置空间
2.全局空间
3.局部空间
取值顺序:
1.局部空间
2.全局空间
3.内置空间

作用域;

  全局作用域  内置 + 全局
  局部作用域  局部

  global : 在局部修改全部变量,如果没有就创建一个新的
  nonlocal : 在局部空间内,修改离自己最近的变量,如果上一层没有就继续向上找,
  直到找到局部变量的顶层,局部空间内没有可以修改的变量,就报错

4.1 函数的嵌套
函数的嵌套-》一个套一个,两个套三个

4.2:函数嵌套内,从最里层返回一个任意字符串,在外部接受打印

2019-03-14-day010-函数进阶的更多相关文章

  1. 2019.03.14 ZJOI2019模拟赛 解题报告

    得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...

  2. python函数进阶(函数参数、返回值、递归函数)

    函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形 ...

  3. python大法好——递归、内置函数、函数进阶

    1.递归(自己干自己) def fun(n): n=n/2 print(n) if(n>2) fun(n) #函数调用 fun(10) 结果是5 2 1 0 递归的执行过程:递归执行到最里面一层 ...

  4. 【转】Python之函数进阶

    [转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...

  5. python学习笔记:第10天 函数进阶和作用域

    目录 1. 函数进阶 2. 命名空间 3. 关键字global和nonlocal 1. 函数进阶 动态接收位置参数 之前写的函数都是固定参数的,假设有个函数需要的参数由几十个,一个个写在形参的位置会非 ...

  6. No-12.函数进阶

    函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形 ...

  7. Python之函数进阶

    本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一.递归函 ...

  8. 深入理解javascript函数进阶系列第一篇——高阶函数

    前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...

  9. [2019.03.25]Linux中的查找

    TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...

  10. 【python 3】 函数 进阶

    函数进阶 1.函数命名空间和作用域 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input , print , str ...

随机推荐

  1. 百度基础架构组-实习生面试(2016.08 java后台开发)

    一.项目 1.Spring MVC与Struts2的区别: 2.MVC三层是如何工作的?比如:要访问一个Url?a=xx&b=xx,怎么找到相应的资源,怎么运算,怎么返回等? 3.数据库myb ...

  2. using强制对象清理资源 【转】

    转 http://www.cnblogs.com/Legolas/p/detail-of-using.html using肯定所有人都用过,最简单的就是使用using引入命名空间,然后就是引入别名,简 ...

  3. Shell里面获取路径的方式

    1. $0 #!/bin/sh echo $0 2.shFile=$(readlink -f $0) #!/bin/sh shFile=$() shDir=$(dirname ${shFile})ec ...

  4. vue组件生命周期详解

    Vue所有的生命周期钩子自动绑定在this上下文到实例中,因此你可以访问数据,对属性和方法进行运算.这意味着你不能使用箭头函数来定义一个生命周期方法.这是因为箭头函数绑定了父上下文,因此this与你期 ...

  5. Qt样式表都有哪些属性可以设置

    我们可以在Qt助手中输入Qt Style Sheets Reference然后选择List of Pseudo-States 项查看Qt控件支持的所有状态. 附几个参考学习的博客: https://b ...

  6. 正则表达式test()和exec()、 search() 和 replace()用法实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. C#执行Sql 时,出现“算术运算导致溢出”问题,如何解决?

    昨天在C#执行oracle的sql语句时,总是报错,原先在pl/sql 执行sql语句是可以的,在C#执行就报“算术运算导致溢出”问题 SQL语句 select A.SKU_ID 商品标识,A.COL ...

  8. \x 和 0x 的区别

    1.0x 表示整型数值 (十六进制) char c = 0x42; 表示的是一个数值(字母B对应的ASCII码——  66),可以认为等价于: int c = 0x42; 2.\x42用于字符表达,或 ...

  9. POJ 1390 Blocks(记忆化搜索+dp)

    POJ 1390 Blocks 砌块 时限:5000 MS   内存限制:65536K 提交材料共计: 6204   接受: 2563 描述 你们中的一些人可能玩过一个叫做“积木”的游戏.一行有n个块 ...

  10. ID基本操作(创建主页,复制主页,把主页应用到多个页面)5.11

    主页上的对象将会显示在应用在这个主页上的所有页面. 一.创建主页的方法: 1.页面面板,右上方点击,可以新建主页..前缀:用来识别页面面板中的各个页面所应用的主页.最多可输入四个字符.名称:输入主页跨 ...