预习新的,随后可能会删除

Python 中 不存在 方法重载。

也就是说,如果存在一个无参方法,又有一个带参的方法名相同的方法,则调用时会执行比较晚才出现的那个方法

一个类实例化时,会默认调用__init__() 方法。

self 是类的实例,指向的是类的地址 。。。而 self.__class__,则指向类

(疑问:类的实例,指向类的地址是否是指内存中的地址, 指向类能否以一个镜像来理解)

下划线的五种含义:

  1. _方法名/变量名    如: _name = "测试"   _dog():

               : 以单个下划线开头的变量或方法仅供内部使用,只有约定,只有方法可以做到不被外部引用。

  1. 单末尾加_    : 防止与关键字冲突
  2. 双前下导线 : 方法和变量都可以私有化
  3. 双前导和双末导:Python中定义的特殊方法,防止自己在属性中使用这种方法
  4. 单下划线:作为一个临时变量使用。。。例如For循环中 i就可以用 单下划线 来表示

继承的定义:

class DerivedClassName--儿子类(BaseClassName1--基类,他爸):

继承属于多继承

子类继承父类时,程序是如何执行的,当创建子类对象时,是率先执行 (——init——)方法?还是依次先 子类属性,在子类构造方法,在普通方法。(还是先走子类的构造,然后走父类的构造,。也就是说  子类的属性,构造,普通方法,以及父类的属性,构造,普通方法他们之间的执行顺序

异常:

try:
    执行语句
except 异常名称(多个异常则用元组形式表现)
    出现异常提示语句
else:
    当try包含的执行语句全部执行完毕,并且没有异常抛出,才会执行else的内容
finally:
    无论try包含的执行语句是否发生异常,finally都会执行

注意点:

如果一个异常在try(或者except,else)出现,却没有任何一个except来接住,则该异常信息就会在finally块执行完毕后才会显示

raise语句抛出一个指定的异常,它的唯一参数指定了要被抛出的异常,它必须是一个异常的实例或者是异常的类(也就是Exception的子类)

导入模块时出错划红线,但实际可以执行

解决办法

yield和return的效果是一样的,但是还是有点区别

  yield是分段来执行一个函数    yield 后面跟的相当于一个输出语句

  return是直接停止这个函数

send和__next__()一样都可以让生成器执行到下一个yield

send和__next__()区别:

send 和 next()都是让生成器向下走一次

send可以给上一个yield的位置传递值,不能给最后一个yield发送值,在第一次执行生成器的时候不能使用send()

第一次调用的时候使用send()也可以但是send的参数必须是None

def func():
    print("111")
    a = yield "yield1"
    print("a=",a)
    print("222")
    b = yield "yield2"
    print("333")
    c = yield "yield3"

g = func()
print(g.__next__())
print("-----------")
print(g.send(1))
print("-----------")
print(g.__next__())

#结果
111
yield1
-----------
a = 1
222
yield2
-----------
333
yield3

动态传参

*参数   是位置参数

**参数  是关键字参数 方法接受到的是字典 

在形参上:*聚合   **聚合

在实参上:*打散   **打散

内置命名空间(优先级最高)

存放Python解释器为我们提供的名字,其中就包括内置函数,list,dict,tuple,set,str,int等都属于内置空间的。  

全局命名空间

局部命名空间:函数内部

取值顺序:就进原则

globals()函数来查看全局作用域中的内容

locals()来查看当前作用域的内容

global 变量名  : 表示使用全局变量

 在局部变量中使用,当全局变量中没有该参数时,则会将局部变量升级为 全局变量   (不推荐)

nonlocal  变量名 : 找局部作用域中,离他最近的那层的变量给引用过来,。如果除全局外的局部都不存在改变量则会报错(No find)

列表表达式

推导式

       字典推导式

list1 = ['1','2','3','4']
list2 = ['a','b','c','d']
dic = {list1[i]:list2[i] for i in range(len(list1))}
print(dic)

#  {'1': 'a', '2': 'b', '3': 'c'}

sorted (iteams , key= function)  排序

函数必须返回一个Int类型的值

li = ["123","12","1234"]
def func(s):
    return len(s)
print(sorted(li,key = func))

'''
li = ["123","12","1234"]
def func(s):
    return len(s)
print(sorted(li,key = lambda s:len(s)))

'''


#结果
['12','123','1234']

filter (function,iteams)筛选

第一个参数:函数,将第二个函数中的每一个元素传个函数,函数返回True,留下该元素      函数必须返回一个Bool类型的值

lis = [1,2,3,4,5]
def func(i):
    return i%2 == 0

li = filter(func,lis)
print(list(li))


'''
lis = [1,2,3,4,5]

li = filter(lambda i:i%2==0, lis)
print(list(li))
'''


#[2,4]

map(fanction.iteams) 

1st = [1,2,3,4]
def func(i):
    return i * i

li = map(func,1st)
print(list(li))

#[1,4,9,16]

第二个map例子:

l1 = [1,2,3,4]
l2 = [2,3,4,5]

li = map(lambda x,y:x+y , l1 ,l2)
print(list(li))

#[3,5,7,9]

递归:

#打开文件夹
import os
file_path = "d:\"
 
def readFile(file_path , n):     #n 控制循环深度 
    it = os.listdir(file_path)    #查看文件夹中的文件
    
    for em in it:                #遍历文件
        #if os.path.isdir(em):    #判断是否为文件夹
        if os.path.isdir(os.path.join(file_path, em))
            print('\t'*n,em)     #打印文件夹
            #readFile(em)        #此时找不到,因为只是文件名,找的是相对位置。   
            readFile(os.path.join(file_path, em ) , n+1)           #如果是,继续调用本方法
        else:
            print('\t'*n,em)     #打印文件

readFile(file_path , 0)

二分查找:

li = [1,2,3,4,5,6,7,7,8,8,9,9,0]
n = 6
right = len(li) - 1                #最左
left =  0                          #最右

while left <= right:
    middle = (right+left)/2        #中间位置随左边或右边的位置发生变化
    if n > li(middle ):           #如果 li的中间索引位置的数值  小于被查找的数,则说明被查找的 数值在,中间索引的右边,。。则要将左边的位置改为  中间索引 +1
        left= middle +1
    elif n < li(moddle):           #如果 li的中间索引位置的数值  大于被查找的数,则说明被查找的 数值在,中间索引的左边,。。则要将右边的位置改为  中间索引 +1
        right = middle -1
    else:
        print("存在")
        print(middle)
        break

面向对象

查询类中所有变量  类名.__dict__

对类的单个变量进行增删改查  可以通过 类.变量

class Person:
    mind = "上帝"

Person.like = "我爱Python"
print(Person.like)        #增
print(Person.mind)       #查
Person.mind = "孙子"    #改
print(Person.mind)
del Person.mind        #删
print(Person.mind)       #报错

面向对象的类名称空间,对象名称空间,的顺序

执行流程:

  1. 看到class后,在内存中开辟 类空间,将静态变量和 静态方法,以及其他方法存到类空间中
  2. 看到 p1 = Person()  后,创建实例化对象空间,此时的空间内容是空(其实有一个指针指向类空间),
  3. 之后会默认执行__init__()方法,再将整个实例化对象空间 赋值给 __init__()的第一个参数self 
  4. 执行__init__()函数体内,向类空间内进行赋值变量
  5. 而且实例化空间对象 中存在一个指针,指向 类空间,将用self 点类名时,会首先在 实例化对象空间内部找,寻找不到就会到 类空间中去找,如果还是找不到就会到父类 空间中去找

寻找属性用的是 就近原则

猜你喜欢

转载自blog.csdn.net/weixin_42598585/article/details/85721404
今日推荐