17-python知识点补充【小知识,面试中可能会考】

1、python的垃圾回收机制

Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题

在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存

2、变量的3大特性:id   type  value

3、input会把用户输入的所有值全部存储为:字符串类型

4、控制循环

while+break 跳出本层循环

while+continue  跳出本次循环,进行下一次循环

5、变量解压【掌握即可】

常规的:

salaries=[11,22,33,44]
s1=salaries[0]    s2=salaries[1]    s3=salaries[2]    s4=salaries[3]
s1,s2,s3,s4=salaries   #此时左边的个数必须=右边列表的长度

特殊的:

s1,s2,_,s4=salaries  #此时取出前2个和最后一个
s1,_,_,s4=salaries
s1,*_,s4=salaries  #这两种方法 都是取出前一个和最后一个
*_,s3,s4=salaries  #取出最后2个

注:*一般取列表(大列表)前几个和后几个数,对于取中间的,不建议使用*

6、数值类型转换

bin()  #把10进制转化为2进制      oct()  #把10进制转化为8进制       hex()  #把10进制转化为16进制 

7、常用的strip()、lower()、upper()、startswith()、endswith()、split()、join()、replace()、isdigit()

strip()  #默认去除空格,可以自己设置

name=input('请输入姓名:').strip()  #最常用的
msg='*****psy**'
print(msg.strip('*'))  #psy
print(msg)  #*****psy**

lower()  #全部大写      upper()全部小写

print('AbCdEf'.lower())  #abcdef
print('AbCdEf'.upper())  #ABCDEF

startswith()  #以什么开头     endswith()  #以什么结尾

print('psy'.startswith('p'))  #True
print('xk'.endswith('k'))  #True

split()  #按分割符把信息切分,存放在列表中     join()  #把列表组合成字符串

st='psy:name:age'
l=st.split(':')  #['psy', 'name', 'age']
res='*'.join(l)  #psy*name*age

replace(A,B,n)  #用B代替A,代替n次(一般情况下,若不指定n,则为全部替换)

msg='psy is a psy_star'
new_msg1=msg.replace('psy','xk')  #xk is a xk_star
new_msg2=msg.replace('psy','xk',1)  #xk is a psy_star

isdigit()  #表示该字符串是否是整数

print('10'.isdigit())  #True
print('5.55'.isdigit())  #False

8、利用列表(list)模拟队列和堆栈

(1)队列  先进先出                    (2)堆栈   先进后出

 

9、enumerate() 函数

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

goods=['apple','banana','pear']
for item in enumerate(goods):
    print(item)
'''
(0, 'apple')
(1, 'banana')
(2, 'pear')
'''

10、字典的更新update()  会覆盖

msg={'name':'psy','age':18}
msg.update({'age':24,'loaction':'NJ'})
print(msg)  #{'loaction': 'NJ', 'age': 24, 'name': 'psy'}

11、集合 set类型

定义在{ }内,用逗号分隔的元素

注意:1)集合中没有重复的元素  2)集合中的元素必须是不可变类型   ===>所以:集合可以去重,但是顺序会变!

空集合  s=set()

思考:想要去重,但是还要保证原来的顺序!        去重:集合   顺序:列表

l=['a','b',1,'a','a',2,1]
l_new=[]
s=set()
for item in l:
    if item not in s:
        s.add(item)
        l_new.append(item)
print(l_new)  #['a', 'b', 1, 2]

12、常见的列表套字典的排序

对下述列表分别按照字典中的age 和name 进行排序

l=[{'name':'psy','age':18},{'name':'pyg','age':55},{'name':'xk','age':24}]
l.sort(key=lambda item:item['age'])
print(l)  #[{'name': 'psy', 'age': 18}, {'name': 'xk', 'age': 24}, {'name': 'pyg', 'age': 55}]

l.sort(key=lambda item:item['name'])
print(l)  #[{'name': 'psy', 'age': 18}, {'name': 'pyg', 'age': 55}, {'name': 'xk', 'age': 24}]

13、字符编码问题

Unicode  内存中固定的编码(各国都在使用)     utf-8   硬盘上都是utf-8编码

【现阶段:内存上的编码是unicode,硬盘上的编码是utf-8,且内存上的编码不能更改】

保证不乱码的核心:文件是以什么形式编码存的,我们就以什么编码读取!

强调:我们能控制的只是存到硬盘上的编码python3解释器:默认是utf-8编码

14、文件操作

(1)打开文件

f=open(r'文件路径',mode='打开文件的模式',encoding='编码')       或者  with open(r'文件路径',mode='打开文件的模式',encoding='编码') as f

利用with的好处:不用关心f.close()       可以打开多个文件

(2)默认打开文件的编码

当前操作系统的编码:linux为utf-8    windows为gbk(一般都是自己设置为utf-8)

(3)操作文件的3种模式

r  默认的打开方式,只读模式    【注:当文件不存在时,报错】

w  只写模式  【注:当文件存在时,清空;当文件不存在时,创建空文档】

a  只追加写模式  【注:当文件存在时,光标直接跑到文件末尾;当文件不存在时,创建空文件】

补充:  b  常用于图片打开,但是不能单独使用,必须 rb,wb,ab    【注:b模式下一定不能指定编码!!!】

15、函数参数  【重点介绍:*args   **kwargs】

*  针对可变程度的位置参数    *将溢出的位置实参全部接受,然后保存成元组形式赋值给args    *args

**  针对可变程度的关键字实参    *将溢出的关键字实参全部接受,然后保存成字典形式赋值给kwargs    *kwargs

def f(x,y,*args):
    print(x,y,args)
f(1,2,3,4,5)  #1 2 (3, 4, 5)

def f(x,y,**kwargs):
    print(x,y,kwargs)
f(x=1,y=2,z=3,a=4,b=5)  #1 2 {'a': 4, 'b': 5, 'z': 3}

【注:一旦碰到实参加*   就把该实参打散,并用元组存放】

def f(x,y,z,*args):
    print(x,y,z)
    print(args)
f(1,2,3,*'hello')
"""
1 2 3
('h', 'e', 'l', 'l', 'o')
"""

重点:*与**的组合使用   (*args和**kwargs的组合使用)  【注:因为位置参数要在关键字参数之前,所以*args在**kwargs之前】  【!!!装饰器!!!

def wrapper(*args,**kwargs):
    print(args)
    print(kwargs)
wrapper(1,2,3,4,5,x=1,y=2,z=3)
"""
(1, 2, 3, 4, 5)
{'x': 1, 'z': 3, 'y': 2}
"""

16、函数中的重点:【名称空间】【作用域】

名称空间:存放名字绑定关系的地方(3种)

(1)内置名称空间:存放python解释器自带的名字,在解释器启动时生效,在解释器关闭时失效    【比如:print   len  strip等等】

(2)全局名称空间:文件级别的名称(顶头写的,没有缩进),在执行文件时生效,在文件借宿或在文件执行期间被删除时失效

(3)局部名称空间:存放函数定义的名字(函数的参数以及函数内的名字都存放在局部名称空间),在函数调用时临时生效,函数结束时失效

加载顺序:内置名称空间===>全局名称空间===>局部名称空间

查找名字:局部名称空间===>全局名称空间===>内置名称空间    【重要!!!】

作用域

(1)全局作用域:包含的是内置名称空间全局名称空间的名字

特点:任何位置都能够访问;该范围内的名字会伴随程序整个生命周期

(2)局部作用域:包含的是局部名称空间的名字

特点:只在函数内使用;调用函数时生效,调用结束失效。

【注:作用域关系是在函数定义阶段就规定死的,与调用函数无关

【So无论函数在哪调用,都必须回到当初定义函数时的位置作用域关系

17、闭包函数   

(1)定义在函数内部的函数  (2)并且该函数包含对外部函数作用域中的名字的使用

【注:作用域在函数定义阶段就规定死了,与调用函数无关!!!】

def outter():
    name='psy'
    def inner():
        print('My name is {}'.format(name))
    return inner  #拿到闭包函数的内存地址
f=outter()
f()  #结果:My name is psy

【注:此时无论在哪调用f函数,结果都是“My name is psy”】

注:闭包都是用于装饰器!!

18、编写一个用户登录的小代码,要求:(1)最多输入3次用户名密码;(2)如果是被锁用户,则一次即退出程序;(3)如果输入正确的用户名密码,则提示登陆成功,程序结束;(4)3次输入不对,会将用户写入被锁用户列表,当然,该用户名需要是在注册用户列表中的。

print("***此程序用于验证用户登录。***")
print("***用户最多可输入3次用户名和密码。***")
print("***输入正确,有提示,不用输满3次,同一个用户名输入错误3次,会被锁***\n")
def checklock(name,lockfile):
    with open(lockfile,'r',encoding='utf-8')as fd:
        lockusername = fd.readlines()
        maxidx = len(lockusername) - 1
        i = 0
        while i <= maxidx:
            if name == lockusername[i].strip("\n"):
                print("用户被锁,请联系管理员")
                return True
            i+=1
        return False
def checkmatch(name,password,userfile):
    with open(userfile,'r',encoding='utf-8')as fd:
        line=fd.readline()
        while line:
            linedate = line.strip("\n").split(":")
            line=fd.readline()
            if name == linedate[0] and password == linedate[1]:
                print("用户名密码正确,登陆成功。")
                return True
        print("用户名密码不正确。")
        return False
def addlockuser(name,userfile,userlockfile):
    with open(userfile,'r',encoding='utf-8')as fd1,open(userlockfile,'a',encoding='utf-8')as fd2:
        line=fd1.readline()
        while line:
            linedate=line.split(":")
            line=fd1.readline()
            if name==linedate[0]:
                fd2.write(name+"\n")
                print(name+"被加入被锁用户列表")
                return ''
trynum=1
while trynum<=3:
    #获得用户输入的用户名和密码
    print("第"+str(trynum)+"次输入。")
    trynum +=1
    name=input("Username: ")
    password=input("Password: ")
    #判断输入的用户名是否在被锁用户列表中
    if checklock(name,"lockuser.txt"):
        exit()
    #判断是否和存储的用户名密码匹配
    elif checkmatch(name,password,"user.txt"):
        exit()
    elif trynum==4:
    #3次输入不对,加入被锁用户文件
        addlockuser(name,"user.txt","lockuser.txt")
        exit()

其中:lockuser.txt为空,当然你也可以自己设置;user.txt中文本为100656c18aa81ada5eb50f82e8c16b2857c.jpg

编写完成啦!!!自己可以调试下代码啊~~~

转载于:https://my.oschina.net/pansy0425/blog/3026640

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值