day12 python
 
一.函数名的应用(是第一类对象)
    函数名的命名规范和变量是一样的
    函数名其实就是变量名
def func():
    print('i am function')
print(func)         #是函数本身, 是一个内存地址
a = func            #变量可赋值, 函数名也可以
a()
func = 6            #函数名就是变量
print(func)
a = 10
b = 20
c = 30
lst = [a, b, c]     #变量可以作为元素加到列表里
print(lst)
 
def func1():
    print('in func1')
def func2():
    print('in func2')
def func3():
    print('in func3')
lst = [func1, func2, func3]     #函数名和变量一样也可以放到列表里, 说明函数是变量名
print(lst)
for el in lst:
    el()
    
    函数名可以作为参数传递给函数
def eat():
    print('eat some thing')
def func(fn):
    fn()
func(eat)
    
    可以作为返回值
def func():
    print('in func')
    a = 10
    def inner():
        print('in inner')
    return inner                #和变量一样可作为返回值, 返回函数名(即函数的内存地址)
 
rst = func()
rst()                           #或写为 func()()
 
二.闭包
    特点: 在内层函数中访问外层函数的变量
    作用: 1. 可以保护你的变量不受侵害(因为全局变量不安全, 因为谁的函数的global都可以改)
def outer():
    a = 10      #作用1.变量安全,只有函数 outer 里面可以改, 对外界的函数不开放
    def inner():
        print(a)
    inner()
outer()
    
    作用: 2. 可以让一个变量常驻内存
def outer():
    a = 10          #作用: 2.常驻内存, 为了inner执行的时候有值
    def inner():
        print(a)
    return inner
inner = outer()
inner()             #作用: 2.因为inner是在outer函数外面执行的, 什么时间执行不确定, 所以要求a要常驻内存
    
    超简易爬虫: 利用闭包把爬取到的内容常驻内存
from urllib.request import urlopen
 
def outer():
    s = urlopen('https://pythonav.com/index/').read()        #后端爬虫, (还有一种前端爬虫)
    def inner():
        print(s)
    return inner
 
rst = outer()
rst()    #第一次耗时
rst()    #第二次直接从内存取
 
#outer()()
#outer()()
#outer()()    #这样写每次都要进行 url 的请求, 是毛用都没有的
    
    __closure__ 判断一个函数是否是闭包
def func():
    a = 10
    def inner():
        print(a)
    print(inner.__closure__)        #如果不是闭包None; 如果是闭包会有一坨东西
func()
 
三.迭代器
    是通用的遍历对象的方式
        1.节省内存
        2.惰性机制
        3.不能重复, 只能向下执行
        4.for循环的内部就是迭代器
 
    dir() 查看对象里面有什么方法, 什么函数(打印出来, 先是带__的, 后是不带的)
print(dir(str))
print(dir(list))
    
    __iter__() 获取当前对象的迭代器, 可以用for循环, 可迭代对象
s = 'bajieai'
it = s.__iter__()   #获取迭代器
print(it)
>>>str_iterator object at 0x0000019B2E778EF0
 
print(dir(it))      #迭代器里面有 __iter__ 和 __next__
print(it.__next__())    #1. 只能向前
print(it.__next__())    #2. 几乎不占内存(明天生成器讲原因)
print(it.__next__())    #3. for循环
print(it.__next__())
print(it.__next__())    #当取完,数据, 会抛出异常StopIteration
    
    用迭代器模拟for循环
lst = ['bajie','wukong','datang','xiyu']
for el in lst:      #底层用的是迭代器
    print(el)
 
lst = ['bajie','wukong','datang','xiyu']
it = lst.__iter__()     #先拿到迭代器
while True:
    try:
        el = it.__next__()  #获取下一个元素
        print(el)
    except StopIteration:
        break
    
    用dir(), 判断数据是否是可迭代的, 是否是迭代器(野路子)
lst = ['bajie', 'wukong', 'datang']
print('__iter__' in dir(lst))       #True
print('__next__' in dir(lst))       #False      lst是可迭代的
 
it = lst.__iter__()
print('__iter__' in dir(it))        #True
print('__next__' in dir(it))        #True       it是迭代器
    
    isinstance(), 判断一个对象是不是Iterator或Iterable类的实例: 判断数据是否是可迭代的, 是否是迭代器(正规的)
from collections import Iterable
from collections import Iterator
 
lst = ['bajie', 'wukong', 'datang']
it = lst.__iter__()
 
print(isinstance(lst, Iterable))    #True
print(isinstance(lst, Iterator))    #False
print(isinstance(it, Iterable))     #True
print(isinstance(it, Iterator))     #True
 
 
 
    练习:
        sum()函数
print(sum((5,6,7)))         #求和, 参数是可迭代的
        reture 和 print()函数
a = print('bajie')       #print打印bajie, 但是不返回任何东西
print(a)                 #所以 a 是None
        max() min()函数
print(max(3,4,5))
print(min(3,4,5))
    求阶乘 如(7*6*5*4*3*2*1)
def func(num):
    sumn = 1
    for i in range(num, 0, -1):
        sumn *= i
    return sumn
print(func(7))
    笛卡尔积 (两个for嵌套)
def func():
    hua = ['hong','hei','hua','pian']
    dian = [2,3,4,5,6,7,8,9,10,'J','Q','K','A']
    rst = []
 
    for h in hua:
        for d in dian:
            rst.append((h, d))
    return rst
 
print(func())
        默认值参数: 可变时
def func(var, lst=[]):      #当默认值参数是可变的类型, 下次用默认值时,使用的是旧的内存空间, 不会分配新的内存空间
    lst.append(var)
    return lst
print(func(10))
print(func(123, []))
print(func('abc'))
        99乘法表
def func(num=9):
    for i in range(1, num+1):
        for j in range(1, i+1):
            print('%sx%s=%s' % (i, j, i*j), end=' ')
        print()
func()
 
 
 
 
 
 
 
 
 
 

day12 python函数名的应用 闭包 迭代器的更多相关文章

  1. 【学习笔记】--- 老男孩学Python,day12 函数名的应用,闭包,迭代器

    1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 1.赋值 def func(): print("你吃了么?") # print(func) # a = func # ...

  2. day 12 函数名的应用 闭包 迭代器

    今日主要内容 1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用   #再函数名后面添加() 才是对函数的调用, 否则打印的是函数的内存地址 1.赋值 2.作为list元素 3.作为参数 d ...

  3. 11.Python初窥门径(函数名,可迭代对象,迭代器)

    Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

  4. python基础之函数名的使用,闭包以及迭代器

    内容梗概: 1. 函数名的使⽤用以及第⼀一类对象 2. 闭包 3. 迭代器 1.函数名一. 函数名的运⽤.函数名是一个变量, 但它是⼀个特殊的变量, 与括号配合可以执行函数的变量.1.1 函数名的内存 ...

  5. python 函数名的应用(第一类对象),闭包,迭代器

    1.函数名的应用(第一类对象) 函数名的命名规范和变量是一样的 函数名其实就是变量名 可以作为列表中的元素进行储存. def func1(): pass def func2(): pass lst = ...

  6. python函数名的应用、闭包和迭代器

    一.函数名的应用(第一类对象) 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数变量. 1.函数名的内存地址 def func(): print("哈哈") prin ...

  7. python 函数名 、闭包 装饰器 day13

    1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...

  8. python 函数名,闭包

    1.函数名字的应用 函数名是什么? 函数名是函数的名字,本质:变量,特殊变量 函数名+() ———>执行此函数: 2.函数名的赋值: def func2(): print(44) f = fun ...

  9. Python函数名做参数,闭包,装饰器

    简单讲解闭包的写法和应用,在这之前,先声明,你定义的任意一个函数都可以作为其他函数的参数.就像下面这段代码的参数func,接收的参数就是一个函数名,在函数体内部使用了func()调用执行函数. 请看下 ...

随机推荐

  1. centos 6.5 切换用户

    root --> user,无需密码 su username user --> root,需要 root 密码 su root root 可省略

  2. Gene Ontology (GO) 注释

    Gene Ontology (GO) 注释  Posted on 2017-06-11 |  In 生信 相似的基因在不同物种中,其功能往往保守的.显然,需要一个统一的术语用于描述这些跨物种的同源基因 ...

  3. idea将本地项目推送到git远程库

    如何将本地项目推送到github远程仓库? 1. 在github上创建一个仓库,取名mybatis 2. 在idea中将项目交由git管理 注意,文件名会变红了, 说明这些文件在git工作区,但还没规 ...

  4. 教你建立SQL数据库的表分区

    1)新建一个数据库 2)添加几个文件组 3)回到“常规”选项卡,添加数据库文件 看到用红色框框起来的地方没?上一步中建立的文件组在这里就用上了.再看后面的路径,我把每一个文件都单独放在不同的磁盘上,而 ...

  5. 迅捷路由器FW325R的无线桥接

    1.恢复路由器默认设置 长按路由器后面的按钮直到指示灯全亮后只剩一个灯亮时松开按钮,此时就已经重置路由器了.然后设置路由器后台密码什么的,那些向导什么的可以跳过 2.高级设置内容 进入路由器高级设置: ...

  6. webpack对icon-font图片的处理

    一.对图片的处理 安装url-loader 然后再loaderli配置这样会把图片打包成base64格式 { test: /\.(gif|png|jpg)\??.*$/, loader: 'url-l ...

  7. vue项目打包之后原本好的样式变得不好了的原因分析

    这个主要是打包的过程将所有的css文件进行归类压缩,导致原先其他文件里的样式对当前的产生了影响,应该有同样的类名了.怎么改?要么改类名,要么用scope,scss的写法.

  8. 7 August

    P1021 邮票面值设计 暴搜各面值. 剪枝1:面值递增,新面值 \(\in[G_{i-1}+1, n\cdot sum]\). 为什么上界不是 \(n\cdot G_{i-1}+1\) 呢? 剪枝2 ...

  9. pytho装饰器参数那些事_inspect.getcallargs

    ''' Created on Jul 26, 2019 @author: tomcat ''' import inspect def chack_admin(func): def wrapper(*a ...

  10. Windows 08R2 IIS网站架设

    目录 目录 配置和安装IIS 环境设置 安装IIS服务器 网站的站点目录和欢迎页面 配置和安装IIS IIS是Windows的网站服务器,所以配置IIS服务的前提是需要一个网址.和DNS域名并添加主机 ...