1. 第一类对象, 函数名的使用
函数名就是变量名, 函数名存储的是函数的内存地址
变量的命名规范:
1. 由数字, 字母, 下划线组成
2. 不能是数字开头, 更不能是纯数字
3. 不能用关键字
4. 不要太长
5. 要有意义
6. 不要用中文
7. 区分大小写
8. 驼峰或者下滑线
代理模式:
# 装饰器的雏形
# 把函数名当成变量来使用
# def chi(fn): # fn 代理了func1和func2
# print("开挂")
# fn()
# print(fn.__name__) # .__name__ 显示调用的函数名
# print("洗包")
#
# def play_dnf():
# print("疯狂的刷")
#
# def func1():
# print("我是func1")
#
# def func2():
# print("我是func2")
#
# def he():
# print("我要喝酒")
# chi(play_dnf)
2. 闭包
闭包: 在内层函数中引入外层函数的变量
作用:
1. 保护变量不受侵害(javascript)
2. 让一个变量常驻内存
爬虫 (low版本):
# from urllib.request import urlopen # 打开一个连接用的模块
# # 外层函数
# def but():
# # 打开连接. 读取源代码
# content = urlopen("http://www.cctv.com/").read() # 永久驻留在内存
# # 内层函数
# def get_content():
# # 返回content
# return content
# return get_content # 内层函数
#
# fn = but() # 这里会很慢. 需要网络请求
# print(fn()) # 不会再进行网络请求了
# print(fn())
关于注释:
# def func(a, b):
# '''
# 文档注释
# 这个函数用来计算两个数的和并返回
# :param a: 第一个数
# :param b: 第二个数
# :return: 第一个数和第二个数的和
# author:sylar
# date:2018-10-31
# '''
#
# print("我是func")
# return a + b
# print(func.__doc__) # document 用来查看文档注释
# print(func.__name__) # name 名字 获取函数名
3. 迭代器
dir() 查看变量能够执行的方法(函数)
# print(dir(str)) # 查看str能够执行的操作. 内部的方法
Iterator: 迭代器, __iter__(), __next__()
Iterable: 可迭代的, __iter__()
for循环的流程:
it = lst.__iter__()
while 1:
try:
el = it.__next__()
for循环的循环体
except StopIteration:
break
从迭代器中获取数据的唯一方法: __next__()
三个特征:
1. 省内存
2. 惰性机制
3. 只能往前. 不能后退