最新学Python 函数从青铜到王者_python学到函数是什么进度(1),74道高级大数据开发面试合集

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

x = int(2.9) # int built-in

g_count = 0 # global
def outer():
o_count = 1 # enclosing
def inner():
i_count = 2 # local
print(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 count
print(count)
count = 100
print(count)
outer()

* ***nonlocal关键字***

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

 

def outer():
count = 10
def inner():
nonlocal count
count = 20
print(count)
inner()
print(count)
outer()

* ***总结***

 

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

 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210610003938175.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjMxMzc0OQ==,size_16,color_FFFFFF,t_70)


### Python 高级函数


#### 1.嵌套函数


* ***嵌套***

 

def bar():
print(‘in the bar’)

def foo(func):
print(‘in the foo’)

def inner():
    return func()

return inner

foo(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 inner

def foo1(func):
def inner(*args,**kwargs):
# 验证
return func(*args,**kwargs)
return inner

@foo
@foo1
def bar(arg1,arg2,arg3):
print(‘bar’)



![在这里插入图片描述](https://img-blog.csdnimg.cn/2021061000434962.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjMxMzc0OQ==,size_16,color_FFFFFF,t_70)


#### 4.装饰器案例


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

 

import time

def 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 a
return 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 getpass

user = ‘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 wrapper
return 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()



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210610004046243.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjMxMzc0OQ==,size_16,color_FFFFFF,t_70)  


![img](https://img-blog.csdnimg.cn/img_convert/d40b9f70d78b63454c8b06459e932120.png)
![img](https://img-blog.csdnimg.cn/img_convert/25a0ac85a1d1902a268786530a95e416.png)
![img](https://img-blog.csdnimg.cn/img_convert/deab7ce4f715287bb0462733195d8f80.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

color_FFFFFF,t_70)  


[外链图片转存中...(img-YhTnm2j1-1715506792792)]
[外链图片转存中...(img-EfcdYN5u-1715506792792)]
[外链图片转存中...(img-npX7l6Jh-1715506792792)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值