1.闭包的概念
(1)定义:闭包是指在函数内部定义的函数,并且在内部函数中使用了外部函数的变量。而且该内部函数可以在外部函数结束后继续访问和操作外部函数的变量。常用于数据隐藏和信息封装。
def hello():
username = '孙晴'
def world():
return username
return world()
(2)闭包的优点
1.数据的隐藏
def hello():
username='孙晴'
def world():
return username
return world()
world = hello()
print(hello())
2.保持状态;捕获和存储变量的状态,即使外部函数已经执行完毕,内部函数仍可以访问和使用这些变量。
def hello(username):
def world():
return username
return world
world1 = hello('孙晴')
world2 = hello('孙晴2')
print(world1())
print(world2())
可以看出效果版;
def hello(username):
def world(statues):
return username+statues
return world
world1 = hello('孙晴')
world2 = hello('孙晴2')
print(world1('没时间'))
print(world2('要上班'))
把孙晴1和2保存在了内存里直到程序执行完毕才能进行释放
3.扩展功能
4.防止变量名污染
(3)闭包的缺点:
1.内存占用
2.可能造成变量泄露
二.常用函数
1.sorted:排序算法
lists= [2,3,4,6,5]
print(sorted(lists))
(2)iterable:可迭代对象
key:用于比较的元素
reverse:排序规则
reverse = True:降序
reverse = False:升序
(3)基本语法:
sorted(iterable,key = None,reverse=False)
filter:
filter() 函数用于 过滤 可迭代对象中不符合条件的元素,返回由符合条件的元素组成的新的迭代器。filter() 函数把传入的函数依次作用于每个元素,然后根据返回值是 True 还是 False,来决定保留或丢弃该元素。
def get_data(x):
return x%2==0
print(list(filter(get_data,range(1,101))))//从1到101之中进行偶数的筛选
reduce:(进行包的引入)求累加累成的运算
from functools import reduce //包的引入
def get_data(x,y):
return x+y
print(reduce(get_data,range(1,101)))
map: python中的一个内置函数,用法同之前讲过的filter函数类似。map在这里的意思是映射的意思,会根据提供的函数对指定序列做映射。
map函数会返回一个迭代器,如果要转换为列表,可以使用 list() 来转换。
def get_data(x):
return x**3
print(list(map(get_data,[1,2,3])))
reverse:进行列表的倒置
lists = [1,2,3,4,5]
print(list(reversed(lists))) //输出[5,4,3,2,1]
max min
*匿名函数:
不需要 def 来定义,使用 lambda 来定义。lambda 的主体是一个表达式,而不是一个代码块,因此只能在lambda表达式中封装有限的逻辑,并且 lambda 函数拥有自己的命名空间。
get_data = lambda x:x**3
print(get_data(3))
三.类和实例
1.类:笼统的概念(多个概念的实例)
2.实例:具体的某一个东西
class Student(object)
class Student(object)://Student属于类属性
province = 'guangdong'//这两个学生都是天津的,这属于固定变量
def __init__(self,name):
self.name = name//self属于实例
student1 = Student('晓红')
student2 = Student('小绿')
print(student1.name,student1.province)
print(student2.name,student2.province)
注意:类属性可以被类调用,实例什么都可以调用。
3.实例方法
class Student(object): //object不继承别的类,类的祖先,也可以把object去掉
province = 'guangdong'
def __init__(self,name):
self.name = name
def say(self)://创建一个新函数,say是新方法
print('{}今天不上班'.format(self.name))//实例方法
student1 = Student('晓红')
student2 = Student('小绿')
student1.say()
student2.say()
4.特殊的定义方式:类方法也属于类)类方法
class Student(object):
province = 'guangdong'
def __init__(self,name):
self.name = name
def say(self):
print('{}今天不上班'.format(self.name))
@classmethod
def hello(cls):#cls此处是类本身
print(cls,'hello world')
Student.hello()
5.静态调用:@staticmethod
@staticmethod
def world():#静态调用此处为空
print('太阳')
Student.world()//实例化过程
补充:类的属性分两种:一种是类属性一种是实例属性
四.面向对象编程
1.类的构造方法:第一是个参数是固定的,永远是self。Python实用new
_init_
2.类的封装:可以直接访问对象里的属性,也可以修改对象里的属性。
stu = Student('太阳',67)
print(stu.name)
stu.print_score()
stu.name = '云朵'
stu.print_score()
内部属性不被外部属性访问可以吧属性名称前加两个下_,以_开头就变成了私有变量,内部可以访问外部不可以。
class Student(object):
def __init__(self, name, score):
self.__name = name //私有属性
self.__score = score
def get_name(self):
return self.__name
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
stu = Student('wang', 22)
print(stu.__name)
stu._Student__name = '李'
print(stu.get_name())
五。继承和多态
1.多重继承
Python 里允许多重继承,即一个类可以同时继承多个类:
class Mammal(Animal)
pass
class Runnable(object)
def run(self)
print('Running..')
class Dog( Mammal, Runnable)
pass
slots 限制实例的属性
由于类的实例可以动态绑定新的属性,有时候我们不希望这样,可以通过slots 进行限制:
class Student(object)
slots _=('name','age')#用tuple 定义允许绑定的属性名称
>>>s=Student ()#创建新的实例
>>>s.name='yjc'#绑定属性'name'
Traceback (most recent call last)File< stdin> line 1. in < module>
>>>s.age=25#绑定属性'age'
>>>s.score =99#绑定属性'score '
type()可以查看一个类型或变量的类型:
print(type(5)) //<class 'int'>
继承关系
对于类的继承关系,使用isinstance ()会更方便:
class Animal(object):
pass dog = Dogo isinstance(dog, Dog)
def run(self)
print('runing')
class Dog(Animal):
isinstance(dog, Dog)
isinstance(dog, object)