变量定义

变量名: 使用数字, 字母,下划线 构成 , 不能有特殊字符(同时变量名不能是数字开头 );

        python的变量采用动态类型,变量的类型可以在程序运行中改变,定义变量不需要向C或java那样指定变量的类型.

#变量在定义的时候,就要给变量赋值,否则会报错

a = 10          #整数
b = 12.3       #浮点数
c = '字符串'  #字符串
d = True      #布尔值

数据类型

int: 整形

        其他语言中的int类型可能占4个字节,8个字节,能表示的数值范围也有限,python中的int能表示的数值范围是"无穷的",int类型可以根据要表示的数值自动扩容。

a = 1

b = 2

c = a+b   #c 的就等于3

        python中没有 short , long 这样的类型

float: 浮点型   

        python中的float占8个字节,同时float就代表了双精度浮点数,C和java中是float代表单精度,double代表双精度。

        python中float就代表双精度浮点数,所以就不需要double类型

str:字符串

        字符串使用单引号 ' ' 或双引号 " "把字符引起来。

#单引号和双引号的作用

#当字符串中需要有引号时
s1 = "my name is "zhangsan" !"   #报错
print(s1)
#引号会跟前面最近的引号匹配 , 导致这段字符串其实是两个字符串
#一个 "my name is "  一个 " !"  中间的zhangsan是没有被引号引起来的

#使用单引号 + 双引号一起用
s2 = 'my name is "zhangsan" !'   #这就是一个合法字符串 
print(s2) 

s1 报错 , s2 正常 , print(s2)输出结果为:

        python中没有chart字符类型(java中有用单引号引起了的单个字符chart类型,,python中无论是用单引号或是双引号引起来的都是字符串类型)

bool: 布尔类型

        True代表正确,False代表错误。同时python中0也可以代表False,非0代表True

a = 0
b = 1
c = -0.1

print(bool(a))   #把0转成bool类型
print(bool(b))   #把1转成bool类型
print(bool(c))   #把-0.1转成bool类型

输出结果

None : 空值

        在python中用None代表空值(C和java中用null代表空)

type(): 查看数据类型方法

        type(): 是python中内置函数,可以查看变量的数据类型

a = 10
b = 1.1
c = 'str'
d = True
e = None
#用type查看各个变量的类型
print(type(a))  #整数 : int
print(type(b))  #浮点数: float
print(type(c))  #字符串: str
print(type(d))  #布尔 : bool
print(type(e))  #空值 : NoneType

输出结果

声明变量类型

        在定义变量时,指定变量是什么类型(不过一般没有什么大用,因为python是动态类型,变量的类型是可以改变的)

语法:

变量名 :要指定的类型 = 赋值

a : int = 1  #指定整形
b : bool = True  #指定布尔类型

因为动态类型,就算给变量指定了类型,也会变量的类型被赋值改变

注释

注释就是在代码运行中不会被执行的代码,

语法: #注释

#这是一行注释,下面才是会被执行的代码

a = 10

运算符

常用运算符

加 : +

减 : -

乘 : *

除 : /         (两个整数相除时,python的除法不会像java中那样向下取整)

取整除 ://    (两个数相除的结果向下去整)

求余数 : %      

判断是否相等、判断是否相同

==  : 判断两个元素的值是否相等       (相等返回True,否则返回False)

is    : 判断两个元素是否相同,两个元素是否是同一个 (相同返回True,否则返回False)

a = 1
b = 1
a == b     #a的值等于b的值,返回 True

a = [1 , 2 , 3]
b = [1 , 2 , 3]
a == b     #a里的值等于b里的值,返回True
a is b     #a 和 b 不是同一个元素,返回False

a = b = 'python'
a is b     #a 和 b 都是指向同一个元素,返回True
逻辑运算符

        逻辑运算符用于条件判断

and : 与         (要两边都是True,才返回True,否则都是返回False)

or :   或          (要两边都是False,才返回False,否则都是返回True)

not : 非          (如果是True,返回相反的False,如果是False,返回相反的True)

True and False    #返回False
True and True     #返回True
 
True or False     #返回True
False or False    #返回False
 
not True          #返回 False
not False         #返回 True
三目运算符

语法: 结果1 if 条件 else 结果2

例子:
a = 1
b = 2
c = a if a < b else b     ==> 如果a < b , 那么c=a , 如果b<a , 那么c = b
                                    ==> 这里因为a小于b,所以c等于a,也就是c == 1

输入和输出

输入 : input()

        input输入得到的值默认是字符串str类型的,可以通过强转的方式把输入的值转成需要的类型

语法 : 

input() :   然后在控制台输入任意字符串 , 回车结束

name =  input("输入你的名字: ")
print(name)
print(type(name))

运行代码可以看到控制台的运行结果

输出 : print()

        可以通过print()在控制台输出东西

语法 : 

print(想要输出的东西)  

字符串格式化

占位符替换

和C语言里一样,python可以使用占位符

通过 % , 来把字符串里的占位符, 替换成对于的数值
如果有多个变量,就用%() , 用括号把多个括起来
​
%d 整数
%s 字符串
%.nf  n位浮点数 
​
name  = '张三'
age = 11
f1 = 20.4221
print('name = %s , age = %d , sum = %.2f'
       %(name , age , f1))
​
​
format() 格式化
f '字符串 {变量}'             // 或者大F 也行
使用f 在字符串里加入要的变量
name  = '张三'
age = 11
f1 = 20.4221
​
print(f'name = {name} ,  age = {age} ,  sum = {age+f1}' )
​
重复字符串
'字符串' * n , 把这个字符串重复n次
 
print('*' * 10) ==> **********

字符串方法

1. str.replace() 替代
s1 = '小明摸出钥匙,要请小红'
print(s1.replace('小明','小蓝'))  ==> 小蓝摸出钥匙,要请小红
//把小明替换成小蓝
2. str.strip () 去掉首尾空格
s2 = ' 111 '
print(s2)   ==> ' 111 '
print(s2.strip())  ==> '111'
3. str.split() 按指定字符分割字符串
s3 = 'a b c'
print(s3.split(' '))  ==> ['a', 'b', 'c']
4. 查找统计
s3 = 'a b c'
​
print(s3.index('a'))    ==> 0   找第一个a在哪个下标,没有就-1 , rindex() 反过来找倒数第一个
​
print(s3.find('b'))     ==> 2  没有找到就-1 , rfind()反过来找倒数第一个
​
print(s3.count('c'))    == 1  有多少个对于字符串 
​
​
​
5.大小写转换
s3 = 'c a b c '
s4 =  s3.upper()      ==> 把小写转大写
print(s4)
print(s4.lower())    ==>把大写转小写

转义字符

制表符: \t

反斜杠 t

引号转义
\'  ==> 把转义成一个引号
print('\'') ==> 打印一个引号'
换行 \n

三引号跨行
用三个引号,打印就可以跨行打印
print(''' 
   111
1111111
''')

列表 list

类似于数组, 但是python里的列表长度是可变的, 列表和字符串一样是有序的,可迭代的

arr = [1 , 2 , 3 , 4 , 6]
print(arr[0]) ==> 1
列表方法
1.append() 添加一个
arr = [1 , 2 , 3 , 4 , 6]
​
arr.append(5)
print(arr)  ==> [1,2,3,4,5,6,5]
2.extend() 添加多个元素
arr = [1 , 2 , 3 , 4 , 6]
​
arr.extend([1 , 2])
print(arr)
​
3.insert() 插入一个元素
arr = [1 , 2 , 3 , 4 , 6]
​
arr.insert(1 , True)
print(arr)   ==> [1 , True , 2 , 3 , 4 , 6]
4.conut() 统计列表里某个元素的数量
arr = [1 , 2 , 3 , 1, 4 , 5]
​
print(arr.count(1)) ==> 2
5.remove() 删除指定的第一个元素
​
arr = [1 , 2 , 3 , 1, 4 , 5]
arr.remove(1)
print(arr)  ==> [2 , 3 , 1 , 4 , 5]
6.pop() 删除指定下标的元素, 默认是删除最后一个
arr = [1 , 2 , 3]
arr.pop()    ==> arr = [1 , 2]
arr.pop(1)   ==> arr = [1 , 3]
7.clear() 清空所有元素
arr = [1 , 2 , 3]
arr.clear()  ==> arr = []
8.sort() 排序 ,默认从小到大
​
arr = [3 , 1 , 2 , 4]
arr.sort()
print(arr)    ==> 1 , 2 , 3 , 4
​
​
// 按从大到小排序
​
arr = [3 , 1 , 2 , 4 , 6 , 5]
arr.sort(reverse = True)   #反转对于 True
print(arr)
​
​
9.reverse() 反转列表
arr = [3 , 1 , 2 , 4]
arr.reverse()
print(arr)    ==> 4 , 2 , 1 , 3
10.join() 用指定字符串拼接 列表里的元素 (只能拼接字符串,列表里的元素要是字符串)
arr = [1 , 2 , 3 , 4]
'+'.join(arr)    ==> 报错
​
arr= ['1' , '2' , '3' , '4']
'+'.join(arr) ==> '1+2+3+4'

元组 tuple

元组 和 列表类似

元组是不可变的序列结构 , 元组一旦创建, 里面的内容不能修改

列表是用中括号[]
元组是用括号()
创建元组

元组创建只有一个元素的话,需要加一个逗号,确定是元组, 否则会被识别成 其他类型

t1 = (1)
print(type(t1))    ==> type = int
t2 = (1,)
print(type(t2))    ==> type =  tuple
元组取值

元组取值和列表一样,用下标索引来取

t1 = (1 , True , 3 , '333' )
print(t1[0])          ==> 1
print(t1[0:])        ==> 1 , True , 3 , '333'
print(t1[-1: -2:-1])     ==> '333'
print(type(t1[0]))     ==> int
​

集合 set

集合是无序的,可变的数据结果 , 用{}大括号表示

集合里放的元素要求是 : 唯一的 , 不可变的数据类型 例如: 数值,字符串 , 元组 , 不能放: 列表这样可变的

s1 = {1 , 2 , 3}
print(type(s1)) ==> set
​
s1 = {[1]}  // 会报错, 集合里不能放列表

集合里放了重复的元素会自动去重

s1 = {1 , 2 , 1 , 2}
print(s1) ==> {1 , 2}

空集合要用 set() 创建

// 因为字典也用{}大括号来创建,如果是空的集合,要用set()创建
​
s1 = {}
print(type(s1))   ==> type = dict 
​
s2 = set()
print(type(s2))   ==> type = set
​
集合的运算

& 交集 , | 并集

s1 = {1 , 2 , 3}
s2 = {2 , 3 , 4}
​
print(s1 - s2)     s1去掉s2里有的  ==> {1}
​
print(s2 - s1)     s2去掉s1里有的 ==> {4}
​
print(s1 & s2)   交集==> {2 , 3} , s1和s2都有的
​
print(s1 | s2)   并集==> {1 , 2 , 3 , 4} s1 加 s2
​
集合的增删改查
s1 = {1 , 2 , 3}
# s1.add(5)         // 增加一个
# s1.remove(1)      //删除一个
​
// update (可迭代的元素)   增加多个元素
s1.update([3 , 4 , 5 , 6])  
print(s1)  ==> {1 , 2 , 3 , 4 , 5 , 6}
​
s1 = {1 , 2 , 3}
s1.update('456') 
print(s1)     ==> {1 , 2 , 3 , 4 ,5 , 6}
​

一般集合的其他操作可以用 list() 把集合转换成列表 在进行

字典 dict

字典是键值对形式的数据类型,通过唯一的键key找到对于的值.

取值 : get()
d1 = {
     '张三' : 1,
     '历史' : 2,
     '王叔' : 3 ,
     '赵六' : 4
}
​
print(type(d1))
print(d1.get('zhangsan'))  ==> None
d1.get('张三') ==> 1
添加修改 : 字典[key] = 值
1. 如果字典里没有 这个key , 则表示添加
​
d1 = {
     '张三' : 1,
     '历史' : 2,
     '王叔' : 3 ,
     '赵六' : 4
}
d1['无敌'] = 0
print(d1) ==> {'张三': 1, '历史': 2, '王叔': 3, '赵六': 4, '无敌': 0}
​
2. 如果字典里有这个key , 就是修改这个key的值
d1 = {
     '张三' : 1,
     '历史' : 2,
     '王叔' : 3 ,
     '赵六' : 4
}
d1['张三']  = 8   
print(d1)       ==> {张三: 8 , ....}
​
批量添加和修改 : 旧字典. update(新字典)
// 把字典1里原有的key的值 , 修改成字典2里有的对于的key的值
d1 = {
     '张三' : 1,
     '历史' : 2,
     '王叔' : 3 ,
     '赵六' : 4
}
​
d2 = {
     '张三' : 3,
     '历史' : 5
}
d1.update(d2)
print(d1)       
​
// 如果字典2里有字典1里没有的key, 就添加进字典1里
d1 = {
     '张三' : 1,
     '历史' : 2,
     '王叔' : 3 ,
     '赵六' : 4
}
​
d2 = {
     '张三' : 9,
     '李四' : 10
}
d1.update(d2)
print(d1)      ==> d1不仅修改了张三的值=9 , 还添加了'李四': 10
取值的同时设置默认值
和java里的getOrDefault()一样, 如果字典里没有对应的key , 则给一个默认值
d1 = {
     '张三' : 1,
     '历史' : 2,
     '王叔' : 3 ,
     '赵六' : 4
}
​
print(d1.setdefault('张四', 0))  ==> 0 , 没有张四, 返回0
d1.setdefault('张三' , 8) ==> 1 , 有张三,返回张三对应的值

删除: del 字典名[key]

删除字典里 的 key

d1 = {
     '张三' : 1,
     '历史' : 2,
     '王叔' : 3 ,
     '赵六' : 4
}
​
del d1['张三']     ==> 删掉 '张三'这个键值对
print(d1)
删除字典最后一个键值对: 字典.popitem()

删除掉字典里最后一个加入的键值对

删除: 字典.pop(key)

删除字典对于的key

d1 = {
    '张三' : 1 , 
    '李四' : 2
}
d1.pop('张三') == > 删掉张三这个键值对
获取所有键: 字典.keys()

获取字典里所有的键

获取所有值 : 字典.values()

获取字典里所有的值

获取所有哦键值对: 字典.items()

扩展

序列同结构都可以用 + 加号拼接
print('111' + '222')          字符串拼接
print([1 , 2 , 3] + [4 , 5 , 7])     列表拼接
print((1 , 2 , 3) + (4 , 5 , 6))   元组拼接

可迭代对象都可以用 in 和 not in 判断
  1. in 在..里面

  2. not in 不知..里面

1 in [1 , 2 ,3]  ==> True
1 in '1234' == > True
0 not in [1 ,2 , 3] ==> True

可迭代对象可以用 len() 获取长度
len('zz') ==> 2
len([1 , 2 , 3]) ==> 3

数据类型对应的布尔值

1.数值 : 除了0 以外都是 True

bool(0) ==> False
bool(0.01) ==> True

2.可迭代对象: 除了空都是True

bool(())  ==> False , 空元组
bool([])  ==> False , 空列表
bool('') ==> False , 空字符串
bool(' ') ==> True , 空格字符串

浅拷贝 和 深拷贝 copy()
链式赋值: a = b = c = [1 , 2 ,3 ] 
这样就类似于浅拷贝, a[0] = 2 , 改了一个,b和c也改了
​
// copy() 就是深拷贝
​
​
a = [1 , 2 , 3]
b = a.copy()
print(a)
print(b)
a[0] = 8        ==> b是深拷贝 ,改a不影响b
print(a)
print(b)

字符串编码

用字符串.encode(编码) 来设置编码

s = '龙傲天'
print(s.encode('gbk'))
print(s.encode('utf-8'))
print(s.encode('ascii'))  // 报错,ascii没有中文

判断

注意python对缩进非常严格

if 条件  : 
  pass      (可以用pass代表空)
else : 
  pass
​
// 格式报错
​
if True :
   pass
print()    ==> 这个缩进问题导致if已经结束了,所以后面else 没有if
else : 
    pass
​
    
// 多层if
if 条件 : 
  pass
elif 条件2 : 
    pass
else : 
    pass

循环

while 循环
while 条件 : 
    代码块

continue 和 break

continue : 跳过这次循环后面的

break : 停止循环

while else 循环

当wile循环结束, 执行 else里的

while 条件 :
     pass
else :   
    pass
​
//输出 2345678910 1   ==> 最后while结束 , 执行else
a = 1
while a < 10 :
    a += 1
    print(a)
else:
    print(1)
​

for 循环

for循环来遍历可迭代对象

1. 列表
list1 = [1 , 2 , 3 , 4]
for a  in list1 :
    print(a)   ==>  输出 1 2 3 4
    
2. 字符串
for a in 'abc' :
    print(a)
   ==> 输出 'a' 'b' 'c'
​
3.for else 和while一样,当循环结束执行else里的
for i in list1 : 
    pass
else : 
    pass

遍历字典

d1 = {'张三':11 , 'lisi' : 12 , 'wangwu': 13}
for i in d1 :
    d1[i] += 10      ==> 给字典里的每个key的值都 +10
​
print(d1)
range() 函数

range可以生成起点到终点的所有整数, (左闭右开 , 不包含终点), 配合for使用

range(起点 , 终点 , 步长)
range(1 , 101 , 1)  生产 1 -100 的所有整数
​
// 输出1到100
for i in range(1 , 101) :
    print(i)
    
    
 

函数

def python的函数使用def来定义

print() , len() ,type() 都是python内置的函数
​
​
def 函数(参数列表)
   return 返回列表
​
函数指定传参
def t1(x  , y ) :
    print(x)
    print(y)
​
​
t1(y= 2 , x = 1)      ==> 指定参数传入给哪个 ;
        
==> 如果不传入好全部参数,就会报错
t1(y =2 )   
==> 会因为x没有传参报错 

函数参数默认值

给参数指定默认值,这样在调用函数时,就可以不一定要传参

def t1(x = 1 , y = 2) :        ==> 创建t1函数时指定了参数的默认值
    print(x)
    print(y)
​
​
t1(x = 2)     ==> 调用函数时,就可以传入指定的参数

函数作用域

函数里的变量的作用域, 如果当前函数有,就用当前的, 没有就往外找

a = 11
b = 13
c = 14
​
def tt1() : 
    print(a)     ==> 用外面的a == 11      
    b = 12
    def t2():
        c = 10
        print(b)       ==> t2里面没有b, 往外找,tt1函数里面有b,就用==>12
        def t3() :        
            print(c)          ==> 10
        t3()
    t2()
tt1()             
​

函数能嵌套调用自己
def t1():
    print(1)
    t1()
​
t1()     ==> 无限重复输出1, 无限调用t1(),最后报错
​

global : 声明变量是函数外的全局变量
a = 1
def test1() :
    global a     #声明这里的a 是函数外面的a
    a += 1
    print(a)     ==> 输出 2
test1()
print(a)       ==> test1改变了a的值 输出2

文件操作

文件权限
read : 读
write: 覆盖写
append: 追加写入
读写模式
r+  : 读写模式,文件必须存在,从头开始读写
w+  : 读写模式,情况文件内容,再写,如果文件不存在则创建
a+  : 追加读写模式,从末尾开始读写,文件不存在则创建
文件操作
open('文件路径+文件名' , '操作模式(默认只读)' , encoding = '编码方式')
​
​
file  = open('123.txt' , 'w' , encoding='utf-8')    ==> 写的方式打开文件, 编码utf8
file.write('无敌了孩子')            
file.close()               ==> 要及时关闭文件
​
file = open('123.txt' , 'r' , encoding='utf-8')
message =   file.read()    ==>  如果文件为空会报错,文件没有内容
print(message)        ==>无敌了孩子
file.close()      ==> 关闭文件
​
seek() 光标

文件进行读写操作后, 光标会移到文件的后面,如果此时光标后面没有数据了,那么进行 读取操作读不到东西报错

file  = open('123.txt' , 'w+' , encoding='utf-8')
file.write('无敌了孩子')      ==>在文件里写入,此时光标在文件末尾,后面没有数据了
​
file.seek(0)         ==> 把光标移动到最开头 , 如果不移动下面的读操作读不到东西
 
message =   file.read()   ==> 这时候再进行读操作,就能过读到东西
print(message)
file.close()
​
with : 上下文管理器

with在内部代码执行完后会自动 close文件 , 防止文件忘记关闭

with open('文件路径文件名' , '打开方式' , encoding='编码') as 变量名 : 
   代码块
​
with open('123.txt' , 'w+' , encoding='utf-8') as file :
 file  = open('123.txt' , 'w+' , encoding='utf-8')
 file.write('无敌了孩子')
 file.seek(0)
 message =   file.read()
 print(message)
==> 不需要自己手动close文件

导包 import

通过import导包, 把别人的包和模块导入进来

import 包名    // 导入包
​
// 给包名起别名
import 包名 as 别名
==> 后面使用别名来调用包里的函数
  原来是==> 包名.函数()     , 别名==> 别名.函数()
​
​
// 导入包里的函数
from 包名 import 函数 
内置模块和第三方模块
  1. 内置模块: python内置的 , 直接用import就可以导入

import calendar as c      ==>导入包名直接使用
​
c.calendar()
  1. 第三方模块: 需要下载了才能使用

// 1. 下载库
pip install 库名 -i  https://pypi.tuna.tsinghua.edu.cn/simple    //(后面是python第三方库的镜像网站)
​
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple 
==> 下载requests 这个库
​
​
//2. 删除库
pip uninstall 库名
​
​
// 3. 查看所有库
pip list
​

OS模块

python的 OS模块是用来和系统交互的模块,允许python进行系统级操作, 比如:创建/删除文件 , 允许shell命令 , 获取系统信息

1.文件重命名 : os.rename()
import  os                ==> 导包 os
​
​
if(os.path.exists('123.txt')) :      ==> 先判断文件是否存在
    print('文件存在')
    os.rename('123.txt' , '333.txt')   ==> 存在就更改名字
else:
    print('文件不存在')
​

更改后123.txt变成 333.txt

2.文件删除 : os.remove()
import  os


if os.path.exists("333.txt") :   ==> 判断文件是否存在
    print('文件存在')
    os.remove('333.txt )    ==> 删除文件
    print('文件删除成功')
else:
    print('文件不存在')
3. 创建目录 : os.makedirs()

可以递归创建多层文件夹 ,

import os

//1. 创建多层文件夹 , 
os.makedirs('aaa/bbb/ccc' , exist_ok=True)  ==> exist_ok = True , 当文件夹已经存在了,就不会继续创建
                      ==> 如果不加上这个=True, 当遇到文件夹存在时会报错

4. 查看所有文件 : os.listdir()
返回指定目录下所有的文件和子目录 (只包含当前这一层目录)

// 当前目录下的所有文件和子目录
os.listdir('.')   ==> '.' 代表当前目录

// 只列出文件    用for 遍历列出所有文件和目录, 然后判断是不是文件,是文件就要
files = [i for i in os.listdir('.') if os.path.isfile(i)]  ==> 把文件取出成列表
                   
print(files)
5. 删除空文件夹 : os.removedirs()
// 2. 递归删除多层文件夹,   
os.removedirs('aaa/bbb/ccc' )  ==> 直接把aaa/bbb/ccc 这几层文件夹都删除了,
前提是 /ccc 目录下没有东西了
==> 先删除了ccc, 然后 bbb空了,删除bbb, aaa也空了,删除aaa
6. 更改工作目录 : os.chdir()

更改python脚步的工作目录 , 当前python脚本在哪个位置,这个pythonProject1就是工作目录

//1 . 获取当前工作目录
os.getcwd()
// 2. 获取绝对路径
os.path.abspath('.')

// 更改当前脚本工作目录
os.chcwd('aaa/bbb')          ==>把当前脚本的工作目录切换到aaa/bbb

==> 注意目录使用/斜杠, 更好跨平台兼容 , 使用反斜杠\, 前面要加r , 就是 r'aaa\bbb' , 否则报错

目录使用斜杠 \ 来 , 更好的跨平台兼容

高级函数

回调函数 : callback

回调函数的作用 : 当完成什么工作后,自动调用

回调函数的本质 : B函数作为A函数的参数, 在A函数里调用 , B函数就是回调函数

// 当打扫卫生后 ,发送通知
def fun1() :
    print('打扫完成')

def fun2(callback) :    ==> 设置参数是回调函数
    print('打扫卫生') 
    callback()      ==> 调用回调函数

fun2(fun1)       ==> 在执行函数时, 传入回调函数
==> 输出
打扫卫生
打扫完成

闭包函数

一个大函数里的小函数, 小函数用到里大函数的数据, 然后大函数返回了小函数

闭包函数的作用 : 1.保存状态 , 2. 封装数据

//1. 保存状态 
闭包函数, 可以在函数1要运行完要拆除了,将里面的内容保存到函数2里,返回函数2, 
这样即使函数销毁了, 里面的内容我们仍然可以通过闭包函数得到

def func1():
    a = 'a'
    b = 'b'
    c = 'c'             ==> 函数里有 a,b,c变量,如果我们需要保留这些数据
    print('func1')
    def func2():        ==>  使用闭包函数,在函数里保func1里的内容
        print('内容: '+ a + b + c)   ==> 将fun1里内容保存到 这个闭包函数里
    return func2         ==> fun1把闭包函数作为返回

t1 = func1()          ==>
t1()


//2. 封装数据     ==> 即使外面的func1()函数已经执行完了,但是里面的数据,还留在他返回的这几个函数里
                
def func1():
    l1 = ['苹果' , '橘子' , '香蕉' , '红糖']

    def show():
        print('箱子里面' , l1)
    def add(num) :
        print(f'添加{num},进入箱子')
        l1.append(num)
    def re(num):
        print(f'删除箱子中的{num}')
        l1.remove(num)
    return {
        'show' : show ,
        'add' : add,
        'remove' :re
    }
sum = func1()
sum['show']()
sum['add']('西瓜')
sum['show']()
sum['remove']('西瓜')
sum['show']

==> 输出
箱子里面 ['苹果', '橘子', '香蕉', '红糖']
添加西瓜,进入箱子
箱子里面 ['苹果', '橘子', '香蕉', '红糖', '西瓜']
删除箱子中的西瓜

匿名函数 : lambda
语法 :  lambda 参数1,参数2... : 表达式        ==> 可以有多个参数,最后返回表达式

==> 正常的相加函数
def func1 (a , b):
    return a + b
==> 使用匿名函数 lambda
func2 = lambda a , b : a + b
print(func2(1, 2))
lambda的用法
排序
l1 =[
    {'name': 'zhangsan' , 'score' : 30},
    {'name': 'lisi', 'score': 90},
    {'name': 'wangwu', 'score': 50},
    {'name': 'zhaoliu', 'score': 70},
]
                                         ==> 列表里都是字典数据,
l1.sort(key = lambda l1 : l1['score'])   ==> lambda匿名函数,告诉sort方法,通过成绩来排序列表里的数据
print(l1)
过滤

有一个列表,过滤掉不需要的数据

// 过滤掉小于等于5的数
​
l1 = [ 12 , 2 , 3 , 76 , 23 , 9 , 3 , 5 , 10 , 11]
​
                 ==> lambda x : x>5 ==> x做参数,判断x是否>5
                 ==> filter(lambda , l1) ==> filter是一个迭代器, 遍历l1这个列表
                           当lambda条件满足,就把数据挑出来
                           也就是在l1里遍历,如果数据满足lambda里的,就返回
                
               ==> list() ==> 把返回的数据生成新的列表
l2 = list(filter(lambda x : x > 5 , l1))
​
​
print(l2)
​
==> 输出
[12, 76, 23, 9, 10, 11]
 

更多推荐