文章目录

  • Python 入门第三天
    • Python 函数入门
      • 1.函数定义
      • 2.函数调用
      • 3.函数的命名规则
      • 4.函数的参数
      • 5. 函数的作用域
    • Python 高级函数
      • 1.嵌套函数
      • 2.装饰器之不带参数的func
      • 3. 装饰器之带参数的func
      • 3.有参数的装饰器
      • 4.装饰器案例

Python 入门第三天

hello ,欢迎看到黄昏的 python 函数部分,这里主要从介绍函数从入门到超神,如果你在学习的过程中,有问题欢迎咨询我哦,我们一起讨论。
此次文章主要介绍函数的入门级和函数的高级,从定义到装饰器。

Python 函数入门

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率

函数有具体的组成部分:函数名,函数体,参数,返回值

从分类上看,函数可分为内置函数自定义函数

为了实现不同的编程需求,还可为函数加上各种规则及作用域的限制,以完成整个功能

1.函数定义

  • 定义函数使用关键字def,后接函数名,再后接放在()中的可选参数列表,最后是冒号。格式如下

    def 函数名(参数1,参数2,...,参数N):
    
  • 例如:

    def max(a, b):                           #定义函数名 max if a >= b:return a  # 返回aelse:return b  # 返回breturn 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
    

2.函数调用

  • 函数调用

    调用时,直接使用函数名称即可
    hello("I love Python!")        # 调用函数,结果输出:I love Python!
    

3.函数的命名规则

  • 函数名的命名有其对应的规则

    • 必须以字母或下划线开头
    • 可以包含任意字母、数字或下划线的组合
    • 不能使用任何特殊字符或标点符号
    • 区分大小写
    • 不能是保留字
    • 不能以数字开头

4.函数的参数

形参是从函数的角度来说的,在定义函数时写到括号中的参数就是形参。所谓形参就是形式上的参数

实参是从调用的角度来说的,在调用函数时写到括号里传给函数的参数就是实参,实参可以是常量、变量、表达式、函数。
实参的个数与类型应与形参一一对应,不能多也不能少

  • 形参与实参的区别:
  • 形参是虚拟的,不占用内存空间。形参变量只有在被调用时才分配内存单元
  • 实参是一个变量,会占用内存空间,数据传送单向,由实参传给形参,不能由形参传给实参
  • 函数的参数有几种:

    • 必备参数:以正确的顺序传入函数。调用时的数量必须和声明时的一样

      def get_info(name, age):print("My name is %s, I'm %d years old." %(name, age))get_info('tom',25)
      get_info('jerry',16)
      
    • 关键字参数:关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值

      def get_info(name, age):print("My name is %s, I'm %d years old." %(name, age))# get_info(16, 'jerry')      # TypeError: %d format: a number is required, not str
      get_info(age=16, name='jerry')  # My name is jerry, I'm 16 years old.
      
    • 默认参数:调用函数时,默认参数的值如果没有传入,则被认为是默认值

      def get_info(name, age, sex='male'):print('Name: %s' %name)print('age: %d' %age)print('Sex: %s' %sex)get_info('tom',23)
      get_info('jerry',30,'female
      
    • 不定长参数:你可能需要一个函数能处理比当初声明时更多的参数

      # def add(x, y):
      #     return x + ydef add(*tuples):sum=0for v in tuples:sum += vreturn sumprint(add(1,4,6,9))         # 20
      print(add(1,4,6,9,5)) 
  • 参数的位置优先级

    • 关键字参数
    • 默认参数
    • args不定长参数
    • kwargs不定长参数

5. 函数的作用域

  • Python中的作用域分4种情况:

    L:local,局部作用域,即函数中定义的变量;

    E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;

    G:globa,全局变量,就是模块级别定义的变量;

    B:built-in,系统固定模块里面的变量。

  • 搜索变量的优先级顺序依次是:
    作用域局部 > 外层作用域 > 当前模块中的全局 > python内置作用域,也就是LEGB。

    x = int(2.9)  # int built-ing_count = 0  # global
    def outer():o_count = 1  # enclosingdef inner():i_count = 2  # localprint(o_count)# print(i_count) # 找不到inner()
    outer()# print(o_count) # 找不到
    当然,local和enclosing是相对的,enclosing变量相对上层来说也是local
    
  • 作用域的产生

    在Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如if、try、for等)是不会引入新的作用域的,如下代码

    if 2 > 1:x = 1
    print(x)  # 1
    

    这个是没有问题的,if并没有引入一个新的作用域,x仍处在当前作用域中,后面代码可以使用

    def test():x = 2
    print(x)    # NameError: name 'x2' is not defined
    

    def、class、lambda是可以引入新作用域的

  • ***变量的修***改

    x = 6
    def f2():print(x)x = 5
    f2()# 错误的原因在于print(x)时,解释器会在局部作用域找,
    # 会找到x = 5(函数已经加载到内存),但 x 使用在声明前了,所以报错:
    # local variable 'x' referenced before assignment.
    # 如何证明找到了x=5呢?简单:注释掉 x=5,x=6
    # 报错为:name 'x' is not defined
    # 同理x = 6
    def f2():x+=1    # local variable 'x' referenced before assignment.
    f2()
    
  • global关键字

    当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了,当修改的变量是在全局作用域(global作用域)上的,就要使用global先声明一下,代码如下\

    count = 10
    def outer():global countprint(count) count = 100print(count)
    outer()
    
  • nonlocal关键字

    global 关键字声明的变量必须在全局作用域上,不能嵌套作用域上,当要修改嵌套作用域(enclosing作用域,外层非全局作用域)中的变量怎么办呢,这时就需要nonlocal关键字了

    def outer():count = 10def inner():nonlocal countcount = 20print(count)inner()print(count)
    outer()
  • 总结

    变量查找顺序:LEGB,作用域局部>外层作用域>当前模块中的全局>python内置作用域;
    只有模块、类、及函数才能引入新作用域;
    对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量;
    内部作用域要修改外部作用域变量的值时,全局变量要使用global关键字,嵌套作用域变量要使用nonlocal关键字。nonlocal是python3新增的关键字,有了这个 关键字,就能完美的实现闭包了。
    

Python 高级函数

1.嵌套函数

  • 嵌套

    def bar():print('in the bar')def foo(func):print('in the foo')def inner():return func()return innerfoo(bar)
    # foo(bar)()
    

2.装饰器之不带参数的func

  • 被装饰的函数

    def decorative(func):def wrapper():    # 定义一个包装器print("Please say something: ")func()        # 调用func,这个func是我们自己定义的print("No zuo no die...")return wrapper@decorative    # 使用@符号调用装饰器
    def show():    # 定义func,名字取什么都无所谓,它只是用来传给装饰器中的func参数print("I'm from Mars.")show()
    

3. 装饰器之带参数的func

  • 被装饰的函数

    def decorative(func):def wrapper(x):print("Please say something...>")func(x)print("no zuo no die...")return wrapper@decorative
    def show(x):print(x)show("hello,mars.")
    

3.有参数的装饰器

  • 一个参数的装饰器

    def foo(func):def inner(arg):# 验证return func(arg)return inner@foo
    def bar(arg):print('bar')
    
  • 两个参数的装饰器

    def foo(func):def inner(arg1,arg2):# 验证return func(arg1,arg2)return inner@foo
    def bar(arg1,arg2):print('bar')
    
  • 三个参数的装饰器

    def foo(func):def inner(arg1,arg2,arg3):# 验证return func(arg1,arg2,arg3)return inner@foo
    def bar(arg1,arg2,arg3):print('bar')
    
  • 不固定参数的装饰器

    def foo(func):def inner(*args,**kwargs):# 验证return func(*args,**kwargs)return inner@foo
    def bar(arg1,arg2,arg3):print('bar')
    
  • 一个函数可以被多个装饰器装饰

    def foo(func):def inner(*args,**kwargs):# 验证return func(*args,**kwargs)return innerdef foo1(func):def inner(*args,**kwargs):# 验证return func(*args,**kwargs)return inner@foo
    @foo1
    def bar(arg1,arg2,arg3):print('bar')
    

4.装饰器案例

  • 为函数添加致谢时间的装饰器函数

    import timedef timmer(func):def wrapper(*args,**kwargs):start_time = time.time()a = func()stop_time = time.time()print('The func run time is %s'% (stop_time-start_time))return areturn wrapper@timmer
    def foo():time.sleep(3)print('in the foo')print(foo())
    
  • 页面验证装饰器

    假定有三个页面,现在要实现其中2个页面验证登录之后才能访问,另一个页面不用验证即可访问首先定义三个页面函数:
    def index():print('Welcome to index page')return 'from index page'def home():print('Welcome to home page')return 'from home page'def bbs():print('Welcome to bbs page')return 'from bbs page'然后定义装饰器函数:import getpassuser = 'sean'
    passwd = 'abc123'
    def auth(auth_type='local'):def out_wrapper(func):def wrapper(*args,**kwargs):if auth_type == 'local':username = input('Username: ').strip()password = getpass.getpass("Password: ").strip()if username == user and password == passwd:print('authentication passed')func(*args,**kwargs)elif auth_type == 'ldap':print('This is ldap authentication')func(*args,**kwargs)return wrapperreturn out_wrapper接下来将装饰器分别应用于home函数与bbs函数:def index():print('Welcome to index page')return 'from index page'@auth('local')
    def home():print('Welcome to home page')return 'from home page'@auth('ldap')
    def bbs():print('Welcome to bbs page')return 'from bbs page'# 调用函数
    index()
    home()
    bbs()
    


欢迎你看到本篇Python 函数的文章,如果对你有用,欢迎关注我,点个赞,收藏下哦。

学Python 函数从青铜到王者相关推荐

  1. 一道大厂Python面试题,4种解法,从青铜到王者引发的“思考”!

    "菜鸟学Python",第"518"篇原创 金九银十应该是校招的黄金时间,大家都知道去大厂面试,算法是一个必须要过的关,无论是笔试还是面试的环节都需要.而算法这 ...

  2. 文科生学python系列_文科生学 Python 系列 3:函数

    文科生学Python系列3:函数​www.jianshu.com 还是第二课的内容 函数是一段可以重复使用的代码,往往是为了解决某个特定的人物.在 Python 中有两种函数:内置函数和自定义函数. ...

  3. python global用法_14_手把手教你学Python之函数(下)

    变量作用域:根据变量定义的位置,可将变量分为全局变量和局部变量. 全局变量:定义在函数外面的变量,可以在多个函数中进行访问,但不能执行赋值操作.如果有赋值语句,相当于创建了一个同名的局部变量: 局部变 ...

  4. 快速记忆python函数-【速学速记】Python的工程化:使用模块

    原标题:[速学速记]Python的工程化:使用模块 前言: Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了收藏已久的视频教程分享给大家!希望能带给 ...

  5. python在匿名函数作和_跟光磊学Python开发-匿名函数函数和高阶函数

    跟光磊学Python开发-匿名函数函数和高阶函数 跟光磊学Python开发-匿名函数函数和高阶函数跟光磊学Python开发 匿名函数 匿名函数就是函数定义时没有名字的函数,也称为匿名表达式. 普通函数 ...

  6. pythonfor循环100次_【零基础学Python】For循环和RANGE()函数

    while循环不断循环,而其条件是True.那如果要限制循环代码块的次数,就可以使用for循环语句和range()函数来执行. 在代码中,一条for语句始终包含以下内容:for关键字 变量名 in关键 ...

  7. turtle 函数 方法_学python第十一节:turtle深入 了解

    学python第十一节:深入分析turtle Turtle是一个直观有趣的图形绘制函数. 这节课对turtle的以下几点进行补充: 在蟒蛇绘制代码中提到过import 库引用保留字的函数,是补充pyt ...

  8. 新手上路必学的Python函数基础知识,全在这里了(多段代码举例)

    导读:函数是Python中最重要.最基础的代码组织和代码复用方式.根据经验,如果你需要多次重复相同或类似的代码,就非常值得写一个可复用的函数.通过给一组Python语句一个函数名,形成的函数可以帮助你 ...

  9. 从零开始学python | 使用Python映射,过滤和缩减函数:所有您需要知道的

    本文分享自华为云社区<从零开始学python | 使用Python映射,过滤和缩减函数:所有您需要知道的>,原文作者:Yuchuan. Python提供了许多预定义的内置函数,最终用户可以 ...

最新文章

  1. 从LSTM到GRU基于门控的循环神经网络总结
  2. APUE(第四章)文件和目录
  3. 学会这两样高级用户,让你成为 Git老手
  4. vue中的v-model原理,与组件自定义v-model
  5. ThinkPHP CURD返回结果参考
  6. 习题7-2 求一批整数中出现最多的个位数字 (20分)
  7. SAP Spartacus 服务器端渲染调试的开发端版本
  8. Dom4j 学习笔记
  9. Vue自定义指令-实时时间转换指令 v-time开发
  10. linux 内核空间 缺页,Linux-3.14.12内存管理笔记【缺页异常处理(1)】
  11. 如何卸载自己手机上的APK文件程序
  12. 服务器项目白名单设置
  13. linux进程磁盘io监测,系统性能检测--磁盘io
  14. python读音有道-centos7安装有道词典(不能发音和取词)
  15. 寻找电路布线最短路径算法BFS
  16. 近世代数-群论基础二
  17. JS、H5调用手机相册摄像头以及文件夹
  18. js前端可视化 | 向量叉乘
  19. jenkins 常用插件
  20. Java8使用jdeps —— Java类依赖性分析器

热门文章

  1. 卷积神经网络 神经网络,卷积神经网络基本操作
  2. 《自然》杂志:人工智能学会触觉,爱抚亲昵指日可待
  3. php要怎么使用imagettftext_手机微信如何使用北斗导航?我们要怎么下载
  4. 苏宁基于 AI 和图技术的智能监控体系的建设
  5. 为什么银行要以科技岗招人然后让干两年柜员?
  6. Unity shader的StencilTest、ZTest与半透明渲染
  7. python aiohttp_Python-异步之aiohttp
  8. UE5学习笔记01(基础操作一)
  9. android平板camera,CameraMator:为单反相机和平板电脑搭桥
  10. Class-agnostic