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()
- 【学习笔记】--- 老男孩学Python,day12 函数名的应用,闭包,迭代器
1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 1.赋值 def func(): print("你吃了么?") # print(func) # a = func # ...
- day 12 函数名的应用 闭包 迭代器
今日主要内容 1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 #再函数名后面添加() 才是对函数的调用, 否则打印的是函数的内存地址 1.赋值 2.作为list元素 3.作为参数 d ...
- 11.Python初窥门径(函数名,可迭代对象,迭代器)
Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...
- python基础之函数名的使用,闭包以及迭代器
内容梗概: 1. 函数名的使⽤用以及第⼀一类对象 2. 闭包 3. 迭代器 1.函数名一. 函数名的运⽤.函数名是一个变量, 但它是⼀个特殊的变量, 与括号配合可以执行函数的变量.1.1 函数名的内存 ...
- python 函数名的应用(第一类对象),闭包,迭代器
1.函数名的应用(第一类对象) 函数名的命名规范和变量是一样的 函数名其实就是变量名 可以作为列表中的元素进行储存. def func1(): pass def func2(): pass lst = ...
- python函数名的应用、闭包和迭代器
一.函数名的应用(第一类对象) 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数变量. 1.函数名的内存地址 def func(): print("哈哈") prin ...
- python 函数名 、闭包 装饰器 day13
1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...
- python 函数名,闭包
1.函数名字的应用 函数名是什么? 函数名是函数的名字,本质:变量,特殊变量 函数名+() ———>执行此函数: 2.函数名的赋值: def func2(): print(44) f = fun ...
- Python函数名做参数,闭包,装饰器
简单讲解闭包的写法和应用,在这之前,先声明,你定义的任意一个函数都可以作为其他函数的参数.就像下面这段代码的参数func,接收的参数就是一个函数名,在函数体内部使用了func()调用执行函数. 请看下 ...
随机推荐
- PL SQL安装
首先,在官网下载PL SQL 的对应版本,本机是64位的就下载64位的,网址:https://www.allroundautomations.com/downloads.html#PLS 点击应用程序 ...
- html5 图片墙
代码实例: <!DOCTYPE html> <html> <head> <style> body,html{ padding:0;margin:0;wi ...
- Java反射学习-5 - 反射复制对象
通过反射方式复制对象: package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Fi ...
- Struts2基础-3 -继承ActionSupport接口创建Action控制器+javaBean接收请求参数+ 默认Action配置处理请求错误 + 使用ActionContext访问ServletAPI
1.目录结构及导入的jar包 2.web.xml 配置 <?xml version="1.0" encoding="UTF-8"?> <web ...
- 如何写一个bat文件,让他去执行某一个地方的bat文件
新建一个bat文件,里面编写如下内容:@echo offcall 你bat文件的路径\startup.bat pause --------------------------------------- ...
- Linux Bash Shell快速入门 (三)
forfor 循环结构与 C 语言中有所不同,在 BASH 中 for 循环的基本结构是: for $var in dostatmentsdone 其中 $var 是循环控制变量, 是 $var 需要 ...
- el-tree或者el-table里边的slot-scope传递变量但是没有元素对象解决方法
传统的是点击一个元素可以通过e.target进行获取,但是对于这种的回调函数里边加个e再进行e.target就获取不到元素了,更获取不到点击的位置那么可以在触发的地方写成箭头函数并且传递一个变量.如下 ...
- [CSP-S模拟测试]:画作(BFS+数学)
题目描述 小$G$的喜欢作画,尤其喜欢仅使用黑白两色作画.画作可以抽象成一个$r\times c$大小的$01$矩阵.现在小$G$构思好了了他的画作,准备动笔开始作画.初始时画布是全白的,他每一次下笔 ...
- php 封装原生数据导入的方法(csv文件格式)
//前端---部分代码 <form class="form-inline" style="margin-top: 20px" method="p ...
- meta标签 使用说明(http-equiv、refresh、seo)
meta标签 使用说明(http-equiv.refresh.seo) meta标签,是在head标签里面,一般用做页面描述的.它的内容,用来描述页面一些信息的,如类型.编码.作者.简介等!虽然,它不 ...