当前位置:

首页 > 编程开发 > Python函数的使用方法

Python函数的使用方法

1.如何用函数先定义后调用,定义阶段只检测语法,不执行代码调用阶段,开始执行代码函数都有返回值定义时无参,调用时也是无参定义时有参,调用时也必须有参2.默认参数陷阱2.1针对可变数据类型,不可变不受影响defc(a=[]):a.append(1)print(a)c()c()c()结果:[1][1,1][1,1,1]defc(a=[]):a.append(1)print(a)c([])c([])c([])结果:[1][1][1]3.名称空间和作用域名称空间就是用来存放名字与值内存地址绑定关系的地方(内存空间

本文目录

      1.如何用函数

      先定义后调用,定义阶段只检测语法,不执行代码

      调用阶段,开始执行代码

      函数都有返回值

      定义时无参,调用时也是无参

      定义时有参,调用时也必须有参

      2.默认参数陷阱

      2.1针对可变数据类型,不可变不受影响

      def c(a=[]):
          a.append(1)
          print(a)
      c()
      c()
      c()

      结果:

      [1]
      [1, 1]
      [1, 1, 1]

      def c(a=[]):
          a.append(1)
          print(a)
      c([])
      c([])
      c([])

      结果:

      [1]
      [1]
      [1]

      3.名称空间和作用域

      名称空间就是用来存放名字与值内存地址绑定关系的地方(内存空间)

      但凡查找值一定要通过名字,访问名字必须去查找名称空间

      名称空间分为三大类

      内置名称空间: 存放的是python解释器自带的名字

      生命周期: 在解释器启动时则生效,解释器关闭则失效

      全局名称空间: 存放的是文件级别的名字

      生命周期: 在解释器解释执行python文件时则生效,文件执行完毕后则失效

      局部名称空间: 在函数内定义的名字

      生命周期: 只在调用函数时临时产生该函数的局部名称空间,该函数调用完毕则失效

      加载顺序

      内置->全局->局部

      查找名字的顺序

      基于当前所在位置往上查找

      假设当前站在局部,查找顺序:局部->全局->内置

      假设当前站在全局,查找顺序:全局->内置

      名字的查找顺序,在函数定义阶段就已经固定死了(即在检测语法时就已经确定了名字的查找顺序),与函数的调用位置无关

      也就是说无论在任何地方调用函数,都必须回到当初定义函数的位置去确定名字的查找关系

      作用域: 作用域指的就是作用的范围

      全局作用域: 包含的是内置名称空间与全局名称空间中的名字

      特点: 全局有效,全局存活

      局部作用域: 包含的是局部名称空间中的名字

      特点: 局部有效,临时存活

      global: 在局部声明一个名字是来自于全局作用域的,可以用来在局部修改全局的不可变类型

      nonlocal: 声明一个名字是来自于当前层外一层作用域的,可以用来在局部修改外层函数的不可变类型

      4.闭包函数

      定义在函数内部且包含对外部函数的作用域名字的引用,需要结合函数对象的概念将闭包函数返回到全局作用域去使用,从而打破函数的层级限制

      闭包函数提供了一种为函数体传值的解决方案

      def func():
          name='egon'
          def inner():
              print(name)
          return inner
      inner = func()
      inner()

      5.函数的参数

      5.1定义阶段

      位置形参

      在定义阶段从左往右的顺序依次定义的形参

      默认形参

      在定义阶段已经为其初始化赋值

      关键字参数

      自由主题

      可变长度的形参args

      溢出的位置参数,打包成元组,给接受,赋给args的变量名

      命名关键字参数

      放在*和之间的参数,必须按照key=value形式传值

      可变长度的位置形参kwargs

      溢出的关键字实参,打包成字典,给**接受,赋给变量kwargs

      形参和实参关系: 在调用函数时,会将实参的值绑定给形参的变量名,这种绑定关系临时生效,在调用结束后就失效了

      5.2调用阶段

      位置实参

      调用阶段按照从左往右依次传入的传入的值,会与形参一一对应

      关键字实参

      在调用阶段,按照key=value形式指名道姓的为形参传值

      实参中带*的,再传值前先将打散成位置实参,再进行赋值

      实参中带的**,在传值前先将其打散成关键字实参,再进行赋值

      6.装饰器:闭包函数的应用

      装饰器就是用来为被装饰器对象添加新功能的工具

      **注意:**装饰器本身可以是任意可调用对象,被装饰器的对象也可以是任意可调用对象

      为何使用装饰器

      **开放封闭原则:**封闭指的是对修改封闭,对扩展开放

      6.1装饰器的实现必须遵循两大原则

      1. 不修改被装饰对象的源代码`

      2. 不修改被装饰器对象的调用方式

      装饰器的目标:就是在遵循1和2原则的前提下为被装饰对象添加上新功能

      6.2装饰器语法糖

      在被装饰对象正上方单独一行写@装饰器的名字

      python解释器一旦运行到@装饰器的名字,就会调用装饰器,然后将被装饰函数的内存地址当作参数传给装饰器,最后将装饰器调用的结果赋值给原函数名 foo=auth(foo) 此时的foo是闭包函数wrapper

      6.3无参装饰器

      import time
      def timmer(func):
          def wrapper(*args,**kwargs):
              start_time=time.time()
              res=func(*args,**kwargs)
              stop_time=time.time()
              print('run time is %s' %(stop_time-start_time))
              return res
          return wrapper
      
      @timmer
      def foo():
          time.sleep(3)
          print('from foo')
      foo()

      6.4有参装饰器

      def auth(driver='file'):
          def auth3(func):
              def wrapper(*args,**kwargs):
                  name=input("user: ")
                  pwd=input("pwd: ")
      
              if driver == 'file':
                  if name == 'egon' and pwd == '123':
                      print('login successful')
                      res=func(*args,**kwargs)
                      return res
              elif driver == 'ldap':
                  print('ldap')
          return wrapper
      return auth3
      
      @auth(driver='file')
      def foo(name):
          print(name)
      
      foo('egon')

      7.题目

      #题目一:
      db='db.txt'
      login_status={'user':None,'status':False}
      def auth(auth_type='file'):
          def auth3(func):
              def wrapper(*args,**kwargs):
                  if login_status['user'] and login_status['status']:
                      return func(*args,**kwargs)
                  if auth_type == 'file':
                      with open(db,encoding='utf-8') as f:
                          dic=eval(f.read())
                      name=input('username: ').strip()
                      password=input('password: ').strip()
                      if name in dic and password == dic[name]:
                          login_status['user']=name
                          login_status['status']=True
                          res=func(*args,**kwargs)
                          return res
                      else:
                          print('username or password error')
                  elif auth_type == 'sql':
                      pass
                  else:
                      pass
              return wrapper
          return auth3
      
      @auth()
      def index():
          print('index')
      
      @auth(auth_type='file')
      def home(name):
          print('welcome %s to home' %name)
      
      
      # index()
      # home('egon')
      
      #题目二
      import time,random
      user={'user':None,'login_time':None,'timeout':0.000003,}
      
      def timmer(func):
          def wrapper(*args,**kwargs):
              s1=time.time()
              res=func(*args,**kwargs)
              s2=time.time()
              print('%s' %(s2-s1))
              return res
          return wrapper
      
      
      def auth(func):
          def wrapper(*args,**kwargs):
              if user['user']:
                  timeout=time.time()-user['login_time']
                  if timeout < user['timeout']:
                      return func(*args,**kwargs)
              name=input('name>>: ').strip()
              password=input('password>>: ').strip()
              if name == 'egon' and password == '123':
                  user['user']=name
                  user['login_time']=time.time()
                  res=func(*args,**kwargs)
                  return res
          return wrapper
      
      @auth
      def index():
          time.sleep(random.randrange(3))
          print('welcome to index')
      
      @auth
      def home(name):
          time.sleep(random.randrange(3))
          print('welcome %s to home ' %name)
      
      index()
      home('egon')
      
      #题目三:简单版本
      import requests
      import os
      cache_file='cache.txt'
      def make_cache(func):
          def wrapper(*args,**kwargs):
              if not os.path.exists(cache_file):
                  with open(cache_file,'w'):pass
      
              if os.path.getsize(cache_file):
                  with open(cache_file,'r',encoding='utf-8') as f:
                      res=f.read()
              else:
                  res=func(*args,**kwargs)
                  with open(cache_file,'w',encoding='utf-8') as f:
                      f.write(res)
              return res
          return wrapper
      
      @make_cache
      def get(url):
          return requests.get(url).text
      
      
      # res=get('https://www.python.org')
      
      # print(res)
      
      #题目四:扩展版本
      import requests,os,hashlib
      engine_settings={
          'file':{'dirname':'./db'},
          'mysql':{
              'host':'127.0.0.1',
              'port':3306,
              'user':'root',
              'password':'123'},
          'redis':{
              'host':'127.0.0.1',
              'port':6379,
              'user':'root',
              'password':'123'},
      }
      
      def make_cache(engine='file'):
          if engine not in engine_settings:
              raise TypeError('egine not valid')
          def deco(func):
              def wrapper(url):
                  if engine == 'file':
                      m=hashlib.md5(url.encode('utf-8'))
                      cache_filename=m.hexdigest()
                      cache_filepath=r'%s/%s' %(engine_settings['file']['dirname'],cache_filename)
      
                      if os.path.exists(cache_filepath) and os.path.getsize(cache_filepath):
                          return open(cache_filepath,encoding='utf-8').read()
      
                      res=func(url)
                      with open(cache_filepath,'w',encoding='utf-8') as f:
                          f.write(res)
                      return res
                  elif engine == 'mysql':
                      pass
                  elif engine == 'redis':
                      pass
                  else:
                      pass
      
              return wrapper
          return deco
      
      @make_cache(engine='file')
      def get(url):
          return requests.get(url).text
      
      # print(get('https://www.python.org'))
      print(get('https://www.baidu.com'))
      
      
      #题目五
      route_dic={}
      
      def make_route(name):
          def deco(func):
              route_dic[name]=func
          return deco
      @make_route('select')
      def func1():
          print('select')
      
      @make_route('insert')
      def func2():
          print('insert')
      
      @make_route('update')
      def func3():
          print('update')
      
      @make_route('delete')
      def func4():
          print('delete')
      
      print(route_dic)
      
      
      #题目六
      import time
      import os
      
      def logger(logfile):
          def deco(func):
              if not os.path.exists(logfile):
                  with open(logfile,'w'):pass
      
              def wrapper(*args,**kwargs):
                  res=func(*args,**kwargs)
                  with open(logfile,'a',encoding='utf-8') as f:
                      f.write('%s %s run\n' %(time.strftime('%Y-%m-%d %X'),func.__name__))
                  return res
              return wrapper
          return deco
      
      @logger(logfile='aaaaaaaaaaaaaaaaaaaaa.log')
      def index():
          print('index')
      
      index()
      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Python
      相关文章 更多
      python删除一个列表里的重复元素的方法与代码示例
      python删除一个列表里的重复元素的方法与代码示例

      学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

      Python写接口的步骤及完整代码示例
      Python写接口的步骤及完整代码示例

      详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

      codex怎么读取word文档及docx文件操作教程
      codex怎么读取word文档及docx文件操作教程

      介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

      怎么在Python中调用C语言代码提升性能
      怎么在Python中调用C语言代码提升性能

      详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

      Python与C语言的性能差异及底层原理
      Python与C语言的性能差异及底层原理

      深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

      Python和C语言哪个更适合编程入门
      Python和C语言哪个更适合编程入门

      客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

      langgraph python guide中文入门教程详解
      langgraph python guide中文入门教程详解

      本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

      Windows 安装 Python:从官方入口到虚拟环境的可复现实践
      Windows 安装 Python:从官方入口到虚拟环境的可复现实践

      面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。