展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > 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
      相关文章 更多
      精品专题 更多
      装机必备

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

      Windows

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

      PDF教程

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

      macOS软件

      正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

      IOS软件

      正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

      AI

      正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

      Mac软件 更多
      Aperty macOS版
      Aperty macOS版

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

      火山引擎 网页版
      火山引擎 网页版

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

      立刻MV 网页版
      立刻MV 网页版

      立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

      蛙蛙写作 网页版
      蛙蛙写作 网页版

      蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

      讯飞智作 网页版
      讯飞智作 网页版

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

      超级简历WonderCV 网页版
      超级简历WonderCV 网页版

      超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

      音述AI 网页版
      音述AI 网页版

      音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

      AionClaw macOS版
      AionClaw macOS版

      AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

      Loomy macOS版
      Loomy macOS版

      Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

      AirBuddy 3 macOS版
      AirBuddy 3 macOS版

      AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

      AirServer macOS版
      AirServer macOS版

      AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

      AnyDesk macOS版
      AnyDesk macOS版

      AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

      WINDOWS 更多
      讯飞绘文 网页版
      讯飞绘文 网页版

      讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

      Maya(Autodesk Maya) Windows版
      Maya(Autodesk Maya) Windows版

      Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

      Aperty Windows版
      Aperty Windows版

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

      火山引擎 网页版
      火山引擎 网页版

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

      立刻MV 网页版
      立刻MV 网页版

      立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

      蛙蛙写作 网页版
      蛙蛙写作 网页版

      蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

      讯飞智作 网页版
      讯飞智作 网页版

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

      超级简历WonderCV 网页版
      超级简历WonderCV 网页版

      超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

      音述AI 网页版
      音述AI 网页版

      音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

      AionClaw Windows版
      AionClaw Windows版

      AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

      Loomy Windows版
      Loomy Windows版

      Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

      AirServer Windows版
      AirServer Windows版

      AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。