python函数菜鸟教程,python函数的用法

  python函数菜鸟教程,python函数的用法

  本文主要详细介绍Python中函数的基础教程。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下,希望能帮到你。

  00-1010 1.如何使用功能2?可变数据类型的默认参数陷阱2.1,不可变且不受影响3。命名空间和范围4。关闭功能5。函数的参数5.1定义阶段5.2调用阶段6。装饰器:闭包函数的应用6.1装饰器的实现必须遵循两个原则6.2装饰器语法糖6.3无参数装饰器6.4-参数装饰器7。标题

  

目录

  先定义再调用。在定义阶段,只检测语法,但不执行代码。

  调用阶段,开始代码执行。

  函数有返回值。

  定义时没有参数,调用时也没有参数。

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

  

1.如何用函数

  

2.默认参数陷阱

  def c(a=[]):

  a .追加(1)

  打印(一份)

  c()

  c()

  c()

  结果:

  [1]

  [1, 1]

  [1, 1, 1]

  def c(a=[]):

  a .追加(1)

  打印(一份)

  c([])

  c([])

  c([])

  结果:

  [1]

  [1]

  [1]

  

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

  名称空间是用来存储名称和值之间的绑定关系的地方(内存空间)。

  但是,搜索值必须按名称,并且在访问名称时必须搜索名称空间。

  名称空间分为三大类

  内置名称空间:它存储python解释器的名称。

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

  全局名称空间:它存储文件级名称。

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

  本地名称空间:在函数中定义的名称。

  生命周期:函数的局部命名空间是在函数被调用时临时生成的,函数被调用后就失效了。

  加载顺序

  内置全局本地

  查找名字的顺序

  基于当前位置查找。

  假设当前电台是本地的,搜索顺序是:本地-全球-内置。

  假设当前站是全局的,搜索顺序是:全局内置。

  名字的搜索顺序在函数定义阶段就已经固定了(也就是在检测语法的时候就已经确定了名字的搜索顺序),与函数的调用位置无关。

  也就是说,无论在哪里调用函数,都必须回到最初定义函数的位置,才能确定名称的搜索关系。

  范围:范围是指行动的范围。

  全局范围:包含内置命名空间和全局命名空间中的名称。

  特点:全球效力,全球生存

  本地范围:包含本地命名空间中的名称。

  特点:局部效果,暂时存活。

  Global:局部声明一个名字来自全局范围,可以用来局部修改全局不可变类型。

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

  

3.名称空间和作用域

  需要结合函数对象的概念,将闭包函数返回到全局范围内使用,从而打破函数的层次限制。

  闭包函数提供了向函数体传递值的解决方案。

  e class="brush:py;">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 auth2(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 auth2

  @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 auth2(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 auth2

  @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()

  

  到此这篇关于Python必备技巧之函数的使用详解的文章就介绍到这了,更多相关Python函数内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: