函数名的运用

函数名的运用:

1.函数名的内存地址

def func():
    print(‘呵呵‘)
print(func)

结果:
<function func at 0x0000000001D51E18>

2.函数名可以赋值给其他变量

def func():
    print(‘呵呵‘)
print(func)

a = func  # 把函数当成一个变量赋值给另一个变量
a()  # 函数调用

3.函数名可以当做容器类的元素

def func():
    print(‘呵呵‘)
def func():
     print(‘呵呵‘)
def func():
    print(‘呵呵‘)
def func():
     print(‘呵呵‘)

lst = [func1,func2,func3]
for i in lst:
i()

4.函数名可以当做函数的参数

def func():
    print(‘吃了吗‘)

def func(fn):
    print(‘我是func2‘)
    fn()   # 执行传递过来的fn
    print(‘我是func2‘)
func2(func)

5.函数名可以作为函数的返回值

def func():
    print(‘这里是函数1‘)
    def func():
        print(‘这里是函数2‘)
     print(‘这里是函数1‘)
     return func_2
fn = func_1()  # 执行函数1,函数1返回的是函数2,这是fn指向的就是上面的函数2
fn()  # 执行上面的函数

.闭包

闭包:是内层函数,对外层函数(非全局)的变量的引用

def func1():
    name = ‘alex‘
    def func2():
        print(name)
    func2()
func1()

结果:
alex

我们可以使用__closuer__来检测函数是否是闭包。使用函名.__closuer__返回cell就是闭包,返回None就不是闭包。

def func1():
    name = ‘alex‘
    def func2():
    print(name)
 func2()
 print(func2.__closuer__)  

结果:alex
(<cell at 0x0000000002178588: str object at 0x00000000024F9308>,)

如何在函数内外调用内部函数

def outer():
    name = ‘alex‘
    # 内部函数
    def inner():
        print(name)
    return inner
 fn  = outer()  # 访问外部函数,获取到内部函数的函数地址
 fn()   # 访问内部函数

  结果: alex

多层嵌套

def func1():
    def func2()
        def func3()
            print(‘嘿嘿‘)
         return func3
     return func2
func()()()

.迭代器

s = ‘abc‘
for c in s:
    print(c)   #  对的

 for i in 123:
    print(i)   #  错的

结果:
Traceback (most recent call last):
  File "E:/python s16/day11 闭包和迭代器/code/day011 迭代器和闭包/05  迭代器.py", line 111, in <module>
    for i in 123:
TypeError: ‘int‘ object is not iterable

报错信息中有这么一句话:‘int‘ object is not iterable。整数是不可迭代对象。 iterable 表示可迭代的,表示可迭代协议。

如何判断按数据类型是否符合可迭代协议,我们可以通过dir函数来查看类中定义好的所有方法。

s = ‘我的娃哈哈‘
print(dir(s)) # 可以打印对象中的方法和函数
print(dir(str)) # 也可以打印类中声明的方法和函数

在打印结果中,寻找__iter__如果能找到,那这个类的对象就是一个可迭代对象。 迭代器.py"

[‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘,
 ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘,
 ‘__getitem__‘, ‘__getnewargs__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘,
  ‘__init_subclass__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘,
   ‘__mod__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ]

tuple,list,open,set,dict,进行for 循环的内容都有__iter__函数,包括range。 这是查看一个对象是否可迭代对象的第一种办法,我们还可以通过isinstence()函数来查看一个对象是什么类型的。

l = [1,2,3,]
l__iter = l,l.__iter__()
form collections import Iterable
form collections import Iterable
print(isinstence(l,Iterable))  # True
print(isinstence(l,Iterator))  # False
print(isinstence(l__iter__,Iterabtor))  # True
print(isinstence(l__iter__,Iterable))   # True

通过以上代码,我们可以确定,如果对象中有__iter__函数,那我们可以认为这个对象遵守了可迭代协议。 就可以获取到相应的的迭代器。这里的__iter__是来帮助我们获取对象的迭代器,我们可以使用迭代器中的__next__() 来获取到迭代器中的元素。

s = ‘我爱北京天安门‘
c = s.__iter__()   #  获取迭代器
print(‘c.__next__()‘)  # 使用迭代器进行迭代,获取一个元素   我
print(‘c.__next__()‘)  # 爱
print(‘c.__next__()‘)  # 北
print(‘c.__next__()‘)  # 京
print(‘c.__next__()‘)  # 天
print(‘c.__next__()‘)  # 安
print(‘c.__next__()‘)  # 门
print(‘c.__next__()‘)  # StopIteration

for循环的机制:

for i in [1,2,3,]:
    print(i)

使用while循环+迭代器来模拟for循环(必须掌握)

lat = [1,2,3,]
lst__iter = lst.__iter__()
while True:
    try;
        i = lst__iter__.__nexy__()
        print(i)
    except StopIteration:
        break

.总结:

lterable:可迭代对象,内不包含函数__iter__()函数
lterator:迭代器,内部包括含__tier__()同时包含__next__().
迭代器的特点:
    1.节省内存
    2.惰性机制
    3.不能反复,只能向下执行

原文地址:https://www.cnblogs.com/zhao-peng-/p/9833034.html

时间: 2024-10-09 20:47:38

函数名的运用的相关文章

C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)

第一种就直接导出函数名如下代码: #ifdef__cplusplus #define TEXPORT extern "c" _declspec(dllexport) #dlse #define TEXPORT _declspec(dllexport) TEXPORT BOOL FUN();//这就是要导出函数 这种方法查看DLL时能看到函数名. 第二种是就导出序号如下代码: bool _stdcall fun(); 在工程右键添加新项目点模块定义文件.DEF, 在在DEF文件里写 LI

SQL SERVER修改函数名引起的问题

1. 问题 今天遇到一个奇怪的问题:使用sp_helptext XXX查询出来的函数定义名竟然跟函数名不同,而sp_helptext实际是查询sys.all_sql_modules这个系统视图的.直接查询这个视图的definition字段,发现跟sp_helptext是一样的.难道是系统视图也存在缓存之类的机制?或者是个BUG?对于第一个问题,当时情况紧急,没有时间去求证是否存在了.第二个问题,我想没什么可能,SQL SERVER发展到今天(SQL 2016正式版准备推出,我使用的环境则是SQL

测试函数用Return 返回值和用函数名返回值的区别

'*************************************************************************'**模 块 名:工程1 - Form1'**说    明:蓝凤凰设计商城 浴火凤凰-郭卫 | 蓝凤凰-魔灵 | 郭卫-icecept'**创 建 人:浴火凤凰-郭卫'**日    期:2015年10月19日  21:53:17'**修 改 人:浴火凤凰-郭卫'**日    期:'**描    述:QQ:493405998 | 微信\旺旺:icece

文件载入流程,函数的使用【函数名,参数【按引用赋值的问题】,函数体,【变量作用域和生命周期】】

1.求最大公约数辗转相除求值例如:12,8求最大公约数12%8=4[不为零]8%4=0[为零,则4为最大公约数][原理就是12,8的最大公约数和8,4的最大公约数一致][这个问题已经可被证明]计算机中最早的算法 2.文件载入---流程[php执行的先后顺序][php对代码的编译以文件为单位]先检查一个文件中的语法再进行编译然后才会一行行解释执行 [这一点需要注意]这里进行文件载入的流程讲解:php文件载入时,被引入的文件中的语法并不会解析,只有当该文件被执行[也就是被引入语句之后的部分才会报错]

js中变量名提升和函数名提升

首先,js中变量没有块级作用域,但是有函数作用域,即只有函数可以约数变量的作用域. 并且,函数的实质也是一个变量,所以可以改变它的值,即赋值.所以变量名提升和函数名提升非常相像. 1.变量名的提升发生在函数内部.看下面的例子.说明:第一个因为弹出undefined,相当于在上面定义了var num;因为函数内部,定义了var num=20:就相当于在一开始定义了var num;这就是变量名的提升. var num = 10; function func() { alert(num); //und

函数是对象,函数名值指针

如题,函数与函数名的关系就和对象与对象指针关系是一样的,如何理解呢? function sum(a,b){ return a+b; } 上述代码定义了一个名为sum的函数,其函数名sum与函数主体的关系如下: 和对象与对象指针的关系一样,一个函数可以有多个名字. function sum(a,b){ return a+b; } alert(sum(10,10));//20 var anotherSum = sum; alert(anotherSum(10,10));//20 上述代码将函数指针s

GO学习笔记 - 函数名前面是否有输入参数肯定是不一样的!!

在刚接触GO语言时候,我相信你也会有这种困惑,为什么有的函数名前面有输入参数,而一些却没有,它们是否有差别?确实有差别,没有输入参数,是一般的函数:有输入参数,是结构的方法,输入参数叫做"方法接收者"!GO语言没有类,方法都定义在结构上了!! 官方教程: 函        数:https://tour.go-zh.org/basics/4 结构体方法:https://tour.go-zh.org/methods/1 实例代码: main.go : 引入了"sunylat/de

对于函数名本质的一点思考

自己在学习函数指针的时候对函数名的意义产生了一点疑惑,经过一些尝试和思考,感觉应该可以像下面这样理解,如果有啥不对的希望大家指正. 首先 我们对变量名的定义做一下回顾: 在C语言里面,我们声明一个变量的时候就会给这个变量名分配一个内存空间,也就是说变量名和内存空间相对应:同时每个内存空间都会有个地址. int a; a=5; 上面两句话说明了:变量a对应的内存空间存储了一个整型数5,并且我们还可以知道这个内存空间的地址是&a. 对于函数的调用我们一般是直接用函数名的,但是在汇编语言里面,调用函数

C++的函数名重载

#include <iostream> using namespace std; int func(int c) { cout<<"int func(int c)"<<endl; } int func(char c) { cout<<"int func(char c)"<<endl; } //函数的重载就是函数名相同,根据参数的类型决定调用哪个函数 int main() { int m; char n; f

python动态修改函数名

困惑 在之前用sgmllib解析网页的时候遇到了·def do_a(self,attr)·这类的函数,可以自动识别<a>并解析其中内容. 在看learningpythonthehardway时也遇到了render.index()之类的随着url路由而变化的函数名. 遂思考,怎么才能实现这种动态的函数名呢? 研究 在使用Java.C.C#等其他语言时,并没有这类的功能.有可能是python独有功能,遂百度,未发现相关介绍. python为动态语言,且为面向对象语言,一切为对象.函数也是一个对象,