名称空间和作用域

1.什么是名称空间
实际上就是储存变量名的地方。
2.代码演示。name = 'moon'
当我们给name赋予一个数据值,其实就是我们把name这个名字放入了一个区域内,记录了name 和数据的地址。
3.三大名称空间
  1.内置名称空间  - 储存所有内置函数和方法名的地方,如:print len input等
  2.全局名称空间  - 当前py文件中的变量名  如 name = 10 
  3.局部名称空间  - 函数或类子代码里面的变量名 def outer():
    																				name = 'moon'
4.名称空间存活周期和作用域
  1.内置名称空间  - python解释器打开则创建关闭则自动销毁。作用域所有的python文件
  2.全局名称空间  - 当前py文件运行则全局名称空间生效,关闭文件则销毁,作用域当前py文件部可以跨文件使用
  3.局部名称空间  - 当前函数体代码被执行,只在当前函数题代码内有效
 
5.名称空间调用顺序
  在全局空间内  优先 全局名称空间 ---> 内置名称空间 
  在局部空间内  优先 局部名称空间 ---> 全局名称空间 ---> 内置名称空间

global与nonlocal

global(变量名)
使用global后可以在局部空间内更改全局空间变量名
nonlocal(变量名)
使用nonlocal可以更改函数体代码外层局部空间变量

函数名的多种用法

def 函数名():
  pass
1.函数名可以当作实参传给函数   函数名(函数名)
2.函数名可以作为返回值被输出。
def 函数名():
  name = 1
  return 函数名
3.函数名可以放入容器类型中,例如字典 可以作为键的值
func_dict = {
    '1': 函数名,
    '2': 函数名,
    '3': 函数名,
    '4': 函数名,
}
func_dict.get('1')() 就可以运行了


闭包函数

1.闭包函数是什么?
定义在函数体内部的函数
内部函数用到了外包函数的变量名
2.代码展示
def outer():  # 外层函数
    x = 100
    def inner():  # 内层函数
        print(x)  # 内层函数用到了外层函数的变量
        
 3.闭包函数传参优势
  def name1(a,b):
    print(a,b)    # 调用函数中我们需要每次都给这个函数体传参才可以
    
 def outer(a,b):
   def name1():
      print(a,b)
   return name1   
变量名 = outer(a,b)  # 第一次使用需要传参
变量名()   # 参数不变的时候就不需要再次传参了 ,如需要改变则再次改变赋值即可
变量名 = outer(c,d)

无参装饰器

1,什么是装饰器?
当我们需要对一个函数增加额外功能,并且不能改变原来的函数题代码 以及 原来的调用方式。

2.根据闭包函数理论进化为装饰器
def func():
  print('执行函数')

def outer(func):
    def inner(*args,**kwargs):
        # 函数代码执行前增加的功能
        res = func(*args,kwargs)  # func = 需要被装饰的函数名
        # 函数代码执行后增加的功能
        return res
    return inner()
func = outer(func)
func()
  
3. 装饰器语法糖
@outer    # 相当于 func = outer(func)
def func():
  print('执行函数')
func()

4.多重语法糖 - 一个函数作用域多个装饰器
@outer3
@outer2
@outer1   
def func():
  print('执行函数')
func()
多重语法糖执行顺序,语法糖从下到上执行 先执行 @outer1,得到返回值再执行@outer2,@outer3 ,最后得到的返回值 再次进行生效
  

有参装饰器

1.什么是有参装饰器?
就是当我们的装饰器里面的函数体代码 需要接收到新的外界的传参
代码展示:
def outer_plus(a,b):
    def outer(func):
        def inner(*args,**kwargs):
            print(a,b)
            res = func(*args,**kwargs)
            return res
        return inner
    return outer
这样我们就可以在最外层传参了

@outer_plus(1,2)
def func():
  pass
#这样我们就可以直接在语法糖后传入装饰器内部需要的参数

装饰器模版

1,无参装饰器
def outer(func):
  def inner(*args,**kwargs)
  	res = func(*args,**kwargs)
    return res
  return inner

@outer
def func():
  pass
func()
  

2.有参装饰器
def outer_pule(a,b):
  def outer(func):
    def inner(*args,**kwargs)
    	res = func(*args,**kwargs)
      return res
    return inner
  return outer

@outer_pule(a,b)
def func():
  pass
func()

递归函数

1.什么是递归函数
递归函数就是函数体代码中又调用了其他函数,并且拥有一个明确的结束条件,这就是递归函数。
代码展示: def index(a):
  					if a == 1:
       				return 1
      			return index(a-1)
      		res = index(5)
          print(res)  # 16
          

二分法

1.什么是二分法
就是通过不断的一分而二 判断查询数据所在位置 ,然后再次一分为二的过程。
!!!必须满足列表为有序时才可以使用,从大到小或者从小到大

代码展示:
l1 = [1.2.3.4.5.6.22.33,44,123,234,355,6664,34534,234234,23423423]
find_num = 123 #要查询的数据可以随时改变
while 1:
  mid_num = len(l1) //2      #查询列表中间数索引位置
  if l1[mid_num] > find_num:   
    l1 = l1[:mid_num]    #如果中间数比查询数大 则保留左边
  elif l1[mid_num] < find_num:
    l1 = l1 [mid_num+1:] #如果中间数比查询数小 则保留右边
  elif li[mid_num] == fund_num:
    	break
  
  #现在举例列表是升序,当然列表是降序也可以

表达式和生成式

在python中,分支结构和for循环结构十分的常用,它们也有一些简化的版本。适用于简单的分支结构和for循环结构

正常分支结构:
name = input('请输入用户名')
if name =='moon':
  print('NB')
else:
  print('SB')
三元表达式:
res = 'NB' if name =='moon' else 'SB' 
一元:数据值  if   二元:判断条件  三元: else 数据值

列表表达式:
l1 = []
for num in [1, 2, 3, 4, 5]:
    l1.append(num + 1)
print(l1)  # [2, 3, 4, 5, 6]
简化版:
l1 = [num + 1 for num in [1, 2, 3, 4, 5]]
[表达式 for 变量名 in 可被遍历的对象]

匿名函数

匿名函数关键词:
lambda 
代码格式:
lambda 行参:返回值
匿名函数的应用场景很小,因为代码不能被函数名找到,所以即用即丢。
它常常搭配一些需要传入函数实参的内置函数使用。

内置函数汇总

map() 映射
res = map(lambda x:x+1, l1)

max()/min() 最大最小值
l1 = [11, 22, 33, 44]
res = max(l1)
res = min(l1)

reduce()
res = reduce(lambda a, b: a * b, l1)  # 计算 ((((1+2)+3)+4)+5)

zip() 拉链
#缝合多个列表的数据,将对应位置的元素组成一个小元组放到列表中。
l1 = [1, 2, 3, 4, 5]
l2 = ['a', 'b', 'c', 'd']
l3 = [11, 22, 33, 44, 55, 66]
res = zip(l1, l2, l3)
print(res)  # <zip object at 0x00000222BA9E7280>  迭代器对象
print(list(res))  # [(1, 'a', 11), (2, 'b', 22), (3, 'c', 33), (4, 'd', 44)]

filter -过滤
1 = [11, 22, 33, 44, 55, 66, 77, 88]
res = filter(lambda x: x > 40, l1)  #匿名函数x返回值x>40 遍历l1
print(list(res))  # [44, 55, 66, 77, 88]

sorted 升序
l1 = [13, 12, 533, 64, 766, 322, 131, 22]
res = sorted(l1)
print(res)  # [12, 13, 22, 64, 131, 322, 533, 766]

asb - 代表数学中的绝对值

all() - 全是  用来元素类型是否都统一

any() - 全或  类似于:0 or 1 or 2 or 3 or 4

bytes - 用于类型转换
s1 = '最近缺觉'
print(bytes(s1, encoding='utf8'))
print(s1.encode('utf8'))

callable  - 查询是否是函数或者类
name = 'leethon'
callable(name) # False
def  index():
    pass
callable(index)  # True
# 无论是函数还是变量,都是名字形式的,就可以用此函数来判断。


chr\ord —— ASCII码值的数字字母对应转换
65-90 是A-Z,97-122 是a-z。

divmod - 整除和取余
divmod(100, 3)  # (33, 1)   代码格式 100 整数3  得到除数和余数

enumerate  - 枚举
通过遍历迭代器对象,得到一个序号与值的二元组迭代器。 
list(enumerate([1, 2, 3, 4]))  # [(0, 1), (1, 2), (2, 3), (3, 4)] 默认从0开始
# start参数,改变序号的开头
# 例子:ASCII表大写字母打印
l1 = [chr(i) for i in range(65, 91)]
print(list(enumerate(l1, start=65)))
[(65, 'A'), (66, 'B'), (67, 'C'), ……, (90, 'Z')]


hash - 哈希加密
print(hash('moon'))  # -2441274338754145093
print(hash('123'))  # -6488149301417385444

isinstance - 判断数据类型 
isinstance(123,int) # True
isinstance([123],int)   # False
#得到的结果是布尔值,待判断数据 加 类型

pow - 幂指数
用于计算数字次方 
print(pow(3,3))  #3*3*3 = 27


round - 通常用于 四舍五入取整
print(round(99.499))  #99
print(round(99.5))  #100

sum - 求和 
l1 = [1,2.3,2,23,1,23,1,23]
print(sum(l1)) # 76.3

可迭代对象

可迭代对象有:
str list dict tuple set 文件对象
可迭代对象特点:
都有对象内置__iter__方法
l1 = [1,2.3,2,23,1,23,1,23]
l2 = 'sdad'
l3 = {'a':'n'}
l1.__iter__()
l2.__iter__()
l3.__iter__()

可迭代的含义
迭代,依赖上一次的结果,来更新下一次。

l1 = [1,2.3,2,23,1,23,1,23]
res = l1.__iter__()
print(res.__next__())
print(res.__next__())
l2 = {'name':'moon','123':'321','222':'333'}
res = l2.__iter__()
print(res.__next__())
print(res.__next__())

# 先使用.__iter__() 把数据变为迭代器对象
#然后在使用.__next__() 进行迭代

for 循环的本

for 变量名 in 可迭代对象\迭代器对象:
	循环体代码
  - 对in后面的对象执行`__iter__`方法得到迭代器对象
  - while循环调用`__next__`取值,赋值给变量名

异常捕捉

  • 语法错误

    语法错误是明眼人一眼能够看出来的,语法这是程序员的基础技能,不容有错

  • 逻辑错误

    一眼可能看不出来,需要经验积累能感知到可能有的逻辑错误。

    比方说,上文变量经过分支可能被赋值为一个字符串类型的数据,但是在后面执行了一个列表的内置方法报错了。

    • 异常位置

    • 异常类型

    • 异常详情

解释器会只能的提示你 异常位置 在 哪 line 行 ,然后告诉你错误类型,还有该错误的解释

自我检测一卷 代码实战部分:

# 可循环根据⽤用户输⼊入的姓名不不同输出不不同的身份信息
# # 添加程序结束功能(如⽤用户输⼊入字⺟母q直接结束识别程序) jason: 扫地僧
# tony: 洗碗⼯工
# kevin: 服务员
# jack: 配菜员
# 其他:未识别
name_dict = {'tony':'洗碗工','kevin':'服务员','jack':'配菜员'}
while True:
    name = input('请输入查询的姓名:')
    # 输入姓名后判断是否在用户字典中
    if name in name_dict:
        print(f'{name}的身份为{name_dict[name]}')
    elif name == 'q':
        print('退出程序')
        break
    else:
        print('未识别')
        
        
  # 利利⽤用for循环及range⽅方法⾃自动⽣生成链家⼆二⼿手房多⻚页数据⽹网址(⼗十条以 上即可)
# 初始⽹网址:https://sh.lianjia.com/ershoufang/

f = 'https://sh.lianjia.com/ershoufang/pg'
#
for i in range(1,12):
    print(f'{f}{i}')
    
  
 # ⽤用户名与密码来源于字符串串source_data = 'jason|123'
# 想办法从中拆分出⽤用户名和密码⽤用于后续账户信息⽐比对 普通要求:
# 1.验证失败情况下可⼀一直循环验证 成功则直接退出 拔⾼高练习:
# 1.只允许三次失败机会
# 2.登录成功后进⼊入内层循环,⽤用户输⼊入任何指令利利⽤用格式化
# 打印正在执⾏行行该⽤用户指令即可,直到⽤用户输⼊入字⺟母q退出内层循环
source_data = 'jason|123'
count = 0
while True:
    if count == 3:
        print('登录失败3次了')
        break
    name = input('请输入用户名').strip()
    password = input('请输入密码').strip()
    r_name,r_pas = source_data.split('|')
    if name == r_name and password ==r_pas:
        print('登录成功')
        while True:
            cmd = input('请输入您的指令')
            print(f'您已成功执行{cmd}指令')
            if cmd == 'q':
                print('退出程序')
                break
    else:
        print('账户或密码错误')
        count += 1 
    

原文地址:http://www.cnblogs.com/moongodnnn/p/16796589.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性