返回顶部
首页 > 资讯 > 后端开发 > Python >Python Day3
  • 873
分享到

Python Day3

Python 2023-01-31 07:01:16 873人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

mode 打开文件方式 r 读(默认) w 写 x 创建并写 a 追加 r+ 读写 w+ 写读 x+ 创建并写读 a+ 追加读 #w a r 三种纯净模式 #如果是windows平台一般还要

mode 打开文件方式
r 读(默认)
w
x 创建并写
a 追加
r+ 读写
w+ 写读
x+ 创建并写读
a+ 追加读

#w a r 三种纯净模式

#如果是windows平台一般还要加上一个小r,意思是取消路径中/的转义功能(不用写//了)
#默认t,指的是文本文件,文本里面存放的是字符,因此涉及到字符编码,如果不指定使用什么字符编码打开就按默认操作系统默认编码打卡,windows默认GBK
f=open(r'a.txt','r',encoding='utf-8')
#读
#这一步说明发送了一个请求给操作系统,把某个文件已什么字符编码打开,同时还拿到了一个变量f

#写 w模式
f=open(r'a.txt','w',encoding='utf-8')
#w打开文件,光标在首行,文件不存在直接创建,存在直接将原来清空
#writable判断是否可写
print(f.writable())
#返回True说明文件可写

f.write('1111\n')
f.write('2222\n')

#writelines以元祖和列表的方式写

f.writelines(['3333\n','444\n'])
f.close()

#写 a模式 追加
#a模式打开后光标直接移动到文件末尾
#文件不存在则创建

f=open(r'a.txt','a',encoding='utf-8')
print(f.writable())
f.write('555\n')

#r模式
# f=open(r'a.txt','r',encoding='utf-8')
#read一次全读取,如果文件大内存可能承受不了
# print(f.read())
#readlines包文件内容全读取,但是放到列表里面去

# print(f.readlines())
# ['1111\n', '2222\n', '3333\n', '444\n', '555\n']

#readline一次只读一行,print自带换行

# print(f.readline(),end='')
# print(f.readline(),end='')
# 1111
# 2222
# f.close()

#!使用for循环读取每行内容,无序再用readline

# with open('a.txt','r',encoding='utf-8') as f:
#     for line in f:
#         print(line)

#b:bytes
#rb模式直接把文件在硬盘上的二进制读取出来
#只有在文件存在的情况下才可以用

#使用图片举例

# with open('01.jpg','rb') as f:
#     print(f.read())

#也可以读取文本文件
#注意了,文本文件可以使用decode进行解码,显示出文本内容

# with open('a.txt','rb') as f:
#     print(f.read())

#不解码
# b'1111\r\n2222\r\n3333\r\n444\r\n555'
#print(f.read().decode())解码

# 1111
# 2222
# 3333
# 444
# 555

#wb

# with open('b.txt','wb') as f:
#     # f.write('你好'.encode('utf-8'))
#     res='你好'.encode('utf-8')
#     print(res,type(res))
#     f.write(res)
# b'\xe4\xbd\xa0\xe5\xa5\xbd' <class 'bytes'>

#ab 追加

# with open('b.txt','ab') as f:
#     res='你好\n'.encode('utf-8')
#     print(res,type(res))
#     f.write(res)

#小练习,模拟linux系统cp命令

# import sys
# _,scr_file,dst_file=sys.argv
#
# with open(scr_file,'rb') as read_f,\
#         open(dst_file,'wb') as write_f:
#     for line in read_f:
#         write_f.write(line)
import os
with open('info.txt','r',encoding='utf-8') as read_f, \
    open('.info.txt.swap','w',encoding='utf-8') as write_f:
    data=read_f.read()
    write_f.write(data.replace('alex','sb'))

os.remove('info.txt')
os.rename('.info.txt.swap','info.txt')

#上面这种方法直接把文件全部读到内存中,有缺陷

#第二种方法
参考1:

import os
with open('info.txt','r',encoding='utf-8') as read_f, \
    open('.info.txt.swap','w',encoding='utf-8') as write_f:
    data=read_f.read()
    write_f.write(data.replace('alex','sb'))
    for line in read_f: #第一种
        write_f.write(line.replace('sb', 'alex'))
    for line in read_f: #第二种
        if 'alex' in line:
            line=line.replace('alxe','sb')
        write_f.read(line)

os.remove('info.txt')
os.rename('.info.txt.swap','info.txt')

参考2:

import os

with open('userlist.txt','r',encoding='utf-8') as read_f, \
    open('.userlist.txt.swap','w',encoding='utf-8') as write_f:
    for line in read_f:
        if 'dzm' in line:
            line=line.split(':')
            line[1]='99'
            line=':'.join(line)
        write_f.write(line)

os.remove('userlist.txt')
os.rename('.userlist.txt.swap','userlist.txt')

#fORMat可以用{}进行占位,如果文件里有{}了,可以在外面再加一层{}进行转义(例如{{}})
#例:根据模板文件生成信息数据文件
#模板文件内容(Nginx.conf.tpl)
{user}

#使用方式:
#定义变量
user = 'dzm'

fhandler = open('nginx.conf.tpl','r')
tpl = fhandler.read()
fhandler.close()

fhandler = open('nginx.conf','w')
fhandler.write(tpl.format(user=user))
fhandler.close()

结果模板文件中的{user}就会变成dzm

#只有一种情况光标以字符为单位:文件以rt方式打开,例如read(3)

# with open('info.txt','r',encoding='utf-8') as f:
#     # print(f.read(6))
#     f.seek(3)#这里移动的是字符
    # print(f.read())
    # print(f.tell())

#b以字节为单位移动
0模式为从文件开头为参照,只有0模式能在t模式下操作

# with open('info.txt','rb') as f:
#     f.seek(6,0) #光标从0个字符(文件开头)移动到第六个字节
#     print(f.tell())
#     6

#1模式以当前位置为参照物
#2模式参照物为文件的末尾
#0,1,2模式都以字节为参照物,但0模式比较特殊,能够用在t模式下

seek(0)就是把光标移动到文件开始位置

# with open('info.txt','rb') as f:
#     f.seek(0,2)#2模式,光标直接移动到了文件末尾
#     print(f.tell())

#模拟tail -f

# import time
# with open('info.txt','rb') as f:
#     f.seek(0, 2)
#     while True:
#         line=f.readline()
#         if line:
#             print(line.decode('utf=8'))
#         else:
#             time.sleep(0.5)
# with open('access.log','a',encoding='utf-8') as f:
#     f.truncate(3)

#从文件开始算起
#按照字符截断,第三个字符后面的内容就会被删除

#自定义函数
#语法:

# def 函数名 (参数1,参数2):
#     '''注释'''
#     函数体
#     return 返回值

def auth():
    name=input('>>: ')
    passWord=int(input('>>: '))
        if name == 'dzm' and password == 123:
            print('登录成功')
    else:
        print('user or pass error')

auth()

#定义函数阶段,只检测语法,不执行代码

#函数的使用要遵循先定义后使用的原则
#使用是指调用这个函数时,函数是否已经定义过
#定义阶段有参数,调用阶段必须有参数
#定义函数的三种类型
#第一种无参函数
#第二种有参函数
#第三种空函数

#有参函数

# def auth(name,password):
#     if name == 'dzm' and password == '123':
#         print('login successfulll')
#     else:
#         print('user or password err')
#
# def interactive():
#     name=input('name>>: ').strip()
#     password=input('password>>: ').strip()
#     auth(name,password)
#
# interactive()

#空函数

# def ls():
#     pass

函数的返回值
#return:函数里可以有多个return,但只能执行一次return
#执行return函数就立即结束,并且把return的值当做本次调用的结果返回
#函数没有return 默认返回None
#return返回多个值会把多个值放入元祖中返回

#return返回的值没有类型限制

#返回值和返回函数的内存地址之间的区别

# def name():
#     return 'dzm'
#
# def password():
#     print('123')
#     return name
#
# print(password())
# <function name at 0x000001B19DF02E18>

# def password2():
#     print('123')
#     return name()
# print(password2())
# dzm

#上面的例子是引用函数时带括号和不带括号的区别,带括号表示函数的返回值,不带括号表示函数本身的内存地址

#函数调用的三种形式

#res=my_max(1,2)
#res=my_max(1,2)*10
#res=my_max(my_max(1,2),3) #把函数调用结果当做另一个函数的参数

#形参:在定义阶段括号内指定的参数,相当于变量名
#实参:在调用阶段括号内传入的值称为实参,相当于值
#在调用阶段,实参的值会绑定给形参,在调用结束后解绑

#参数分类

#1.位置参数

#位置形参:从左至右依次定义参数
#位置实参:与形参一一对应传值

#2.关键字参数

#关键字实参和位置实参可以混用,但关键字实参要在位置实参后面
#不能为同一个参数赋多次值

#3.默认参数,在函数定义阶段就已经为形参赋值

#定义阶段已经有值以为着调用阶段可以不用传值
#注意:
##1.默认参数必须放到位置形参后面

## def reGISter(name,age,sex='male'):
##     print(name,age,sex)

##2.默认参数的值只在定义阶段被赋值一次
##3.默认参数通常为不可变类型

#4.可变长参数:在函数调用时,实参值的个数不固定
#实参的形式有:位置实参和关键字实参
#形参的解决方案:*,**

#只接受位置传参多余的参数,并将多余的传参转换为元祖形式保存
#
args是约定俗成的写法

# def foo(x,y,*args): #args=(3, 4, 5)
#     print(x,y)
#     print(z)
# foo(1,2,3,4,5)
# 结果
# 1 2
# (3, 4, 5)

#实参当中的
#实参当中碰到
就代表位置传参,将后面的内容转成原型理解即可,如下例

# foo(1,2,*[3,4,5,6]) #foo(1,2,3,4,5,6)
# foo(*[1,2,3,4,5,6]) #foo(1,2,3,4,5,6)

#*后面的内容直接就是位置参数

只接受关键字传参多余的参数,并将多余的传参转换为字典形式保存
kwargs也是约定俗成的写法

# def foo(x,y,**kwargs): #kwargs={'a': 3, 'b': 4, 'c': 5}
#     print(x,y)
#     print(kwargs)

# foo(y=2,x=1,a=3,b=4,c=5)
#结果

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

#实参当中的
#将实参当中
后面的内容理解成关键字传参即可
# foo(y=2,**{'c':5,'b':4,'a':3}) #等同于foo(y=2,c=5,a=3,b=4)

#举例
#下面这种写法可以把一个函数得到的传参以原封不动的形式传给它内部的另外一个函数

def bar(x,y,z):
    print(x,y,z)
#*一定要在**之前
def wrapper(*args,**kwargs): #args=(1),kwargs={'y':2,'z':3}
    bar(*args,**kwargs) #bar(1,y=2,z=3) #又打回了原型
    wrapper(1,y=2,z=3)

#了解即可
#命名关键字参数,指的是定义在后面的参数,该参数必须被传值(除非它有默认值),并且必须以key=value的方式传值
#
args也算,后面的就都是命名关键字参数了

#函数是第一类对象:指的是函数可以当做数据传递
#1.可以被引用 x=1,y=x

# def func(x,y)
#     print(x,y)
#
# f=funC#把函数本身赋值
# f(1,2)

#2.可以当做函数的参数传入

# def foo():
#     print('from foo')
# def bar(func):
#     func()
#
# bar(foo)
#

#3.可以当做函数的返回值

# def foo():
#     print('from foo')
# def bar(func):
#     return func
#
# f=bar(foo)
# f()

#4.可以当做容器类型的元素

# def foo():
#     print('from foo')
# def bar(f):
#     return foo
#
# l=[foo,bar]
# l[0]()

#到了列表里也是函数

# def ls():
#     print('ls')
#
# func_dic={
#     'ls':ls,
# }
#
# name=input('>>: ').strip()
# if name in func_dic:
#     func_dic[name]()

#函数的嵌套调用

def my_max(x,y):
    if x >= y:
        return x
    else:
        return y

def my_max2(a,b,c,d):
    res1=my_max(a,b)
    res2=my_max(res1,c)
    res3=my_max(res2,d)

    return res3

#函数的嵌套定义
#在函数内部定义的函数只能在函数内部使用

# def f1():
#     def f2():
#         print('from f2')
#         def f3():
#             print('from f3')
#         f3()
#     f2()
#
# f1()

#内置名称空间:python解释器内置的名字,len,print等
#Python解释器启动就有

#全局名称空间
#执行python文件时才生效
#顶着头写的名字就是全局空间

# x=1
# def func():pass
# import time

#局部名称空间:函数内部定义的
#函数被调用时才会执行函数内的代码,函数内局部名称空间的名称才会生效,调用结束失效

#加载顺序:内置---》全局---》局部名称空间
#访问名字的顺序:局部名称空间---》全局---》内置

#1、作用域即范围
#- 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效
#- 局部范围(局部名称空间属于该范围):临时存活,局部有效
#2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下

x=1
def f1():
    def f2():
        print(x)
    return f2
x=100
def f3(func):
    x=2
    func()
x=10000
f3(f1())

#使用global x这样的形式可以把局部名称定义为全局名称
#使用nonlocal x这样的形式可以把局部名称向上覆盖上一级函数相同名称,但出不了整个函数

#3、打破函数层级限制来调用函数
#例

# def outter():
#     def inner():
#         print('inner')
#     return inner
#
# f=outter()
#
# def bar():
#     f()
# bar()

#4、查看作用域:globals(),locals()

#LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> builtins
#locals 是函数内的名字空间,包括局部变量和形参
#enclosing 外部嵌套函数的名字空间(闭包中常见)
#globals 全局变量,函数定义所在模块的名字空间
#builtins 内置模块的名字空间

#一 什么是闭包?

#内部函数包含对外部作用域而非全局作用域的引用

#通常将闭包函数用return返回,然后可以在任意使用

#提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路
#举例:

# def outer():
#     x=1
#     y=2
#     def inner():
#         print(x,y)
#     return inner
#
# f=outer()
#
# def bar():
#     x=111112
#     y=33333
#     f()
#
# bar()

#二 闭包的意义与应用
#闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
#应用领域:延迟计算(原来我们是传参,现在我们是包起来)

# import requests
#
# def outter(url):
#     def get():
#         response = requests.get(url)
#         if response.status_code == 200:
#             print(len(response.text))
#     return get
#
# baidu=outter('https://www.baidu.com')
#
# baidu()

#无参装饰器
#开放封闭原则:对修改封闭,对扩展开放
#强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式
#装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能

# import time
# def index():
#     time.sleep(3)
#     print('welcome to index')
#
# def timmer(func):
#     def inner():
#         start=time.time()
#         func()
#         stop=time.time()
#         print('run time is %s' %(stop-start))
#     return inner
#
# index=timmer(index)
# index()

#装饰器语法:@装饰器名

# import time
#
# def timmer(func):
#     def inner():
#         start=time.time()
#         func()
#         stop=time.time()
#         print('run time is %s' %(stop-start))
#     return inner
#
# #py解释器遇到@就会把@timmer下面的函数名当成参数传给timmer这个函数,并且把结果重新命名给index
# @timmer #index=timmer(index)
# def index():
#     time.sleep(3)
#     print('welcome to index')
#     return 111
# index()

#装饰器改进1
#理解上面的装饰器,会想到一个问题,如果函数index有返回值的话,那么按照上面的写法就无法实现返回index的返回值,因为index()实际执行的是inner(),而inner()返回值为空
#按照下面改进,可以解决这个问题

#import time

# def timmer(func):
#     def inner():
#         start=time.time()
#         res=func() #这里执行的是原始的index函数
#         stop=time.time()
#         print('run time is %s' %(stop-start))
#         return res
#     return inner
#
# @timmer #index=timmer(index)
# def index():
#     time.sleep(3)
#     print('welcome to index')
#     return 111
#
# res=index()
# print(res)

#装饰器改进2
#这个改进解决了传参问题

# import time
#
# def timmer(func):
#     def inner(*args,**kwargs):
#         start=time.time()
#         res=func(*args,**kwargs) #这里执行的是原始的index函数
#         stop=time.time()
#         print('run time is %s' %(stop-start))
#         return res
#     return inner
#
# @timmer #index=timmer(index)
# def index(name):
#     time.sleep(3)
#     print('welcome %s to index' %name)
#     return 111
#
# res=index('dzm')
# print(res)
 import time

 def auth2(engine='file'):
     def auth(func): # func=index
         def inner(*args,**kwargs):
             if engine == 'file':
                 name=input('name>>: ').strip()
                 password=input('password>>: ').strip()
                 if name == 'eGon' and password == '123':
                     print('login successful')
                     return func(*args,**kwargs)
                 else:
                     print('login err')
             elif engine == 'Mysql':
                 print('mysql auth')
             elif engine == 'ldap':
                 print('ldap auth')
             else:
                 print('engin not exists')
         return inner
     return auth

#碰到函数加括号优先执行,先不要管@符号
@auth2(engine='mysql') #@auth #index=auth(index) #index=inner
def index(name):
     time.sleep(1)
     print('welecome %s to index' %name)
     return 1111

 res=index('egon') #res=inner('egon')
 print(res)
from functools import wraps
import time
def timmer(func):
    @wraps(func)
    def inner(*args,**kwargs):
        start=time.time()
        res=func(*args,**kwargs)
        stop=time.time()
        print('run time is %s' %(stop-start))
        return res
    # inner.__doc__=func.__doc__
    # inner.__name__=func.__name__
    return inner

@timmer
def index(name): #index=inner
    '''index 函数。。。。。'''
    time.sleep(1)
    print('welecome %s to index' %name)
    return 1111

# res=index('egon')
# print(res)

print(help(index))

--结束END--

本文标题: Python Day3

本文链接: https://lsjlt.com/news/192292.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python Day3
    mode 打开文件方式 r 读(默认) w 写 x 创建并写 a 追加 r+ 读写 w+ 写读 x+ 创建并写读 a+ 追加读 #w a r 三种纯净模式 #如果是windows平台一般还要...
    99+
    2023-01-31
    Python
  • python 22- day3
    1、知识点补充 2、编码 3、集合 4、深浅copy 5、文件操作 file1 = open("D:/myclass/课堂文件/day02/day02/02 字符串.py",encoding='utf-8',mode='r') print...
    99+
    2023-01-31
    python
  • python学习(day3)
    1、集合的使用:#1、集合的操作: list_1 = [1,4,5,7,3,6,7,9] list_1 = set(list_1)#创建集合 list_2 = set([2,6,0,22,66,8,4]) print(list_1,typ...
    99+
    2023-01-31
    python
  • python笔记day3
    字典修改或者添加:dict['key'] = value程序二:file1.txt文件内容如下:alex|123|1carrick|123|1tony|123|1从文件file1.txt中读出内容,写成dic = {'carrick': [...
    99+
    2023-01-31
    笔记 python
  • python 基础 day3
    python 操作文件的常用方式有如下 读文件:r 模式 实例演示1:f1 = open(file='D:\Python3.5-learn\模块2\character3_文件操作\staff_table.txt',mode='r',enco...
    99+
    2023-01-31
    基础 python
  • python 学习day3
    set(无序不重复的序列)创建两种方式 例一:s1 = {1,2,3} 例二:s2 = set() ,s3 = set([1,2,3,4,5])功能 s2.add(123) #添加s2集合中123元素 s2.clear() #清除内容 s2...
    99+
    2023-01-31
    python
  • day3 python函数
    自定义函数:def myfun(args1,args2):函数体return value def get_info(): userinfo = {} with open("info.txt","r",encoding="ut...
    99+
    2023-01-31
    函数 python
  • Day3 python基础
    集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集、差集、并集等关系 list_1 = [1, 4, 5, 7, 3, 6, 7, 9] list_1 = ...
    99+
    2023-01-31
    基础 python
  • Python练习题(day3)
    一、函数练习题: 1、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作 2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数 3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于...
    99+
    2023-01-31
    练习题 Python
  • Python-day3作业-haprox
    #!/usr/bin/env pythonimport os,sys,time,re,prettytable,jsonfrom collections import defaultdict,OrderedDictconf='haproxy....
    99+
    2023-01-31
    作业 Python haprox
  • python爬虫笔记-day3
    正则使用的注意点re.findall("a(.*)b","str"),能够返回括号中的内容,括号前后的内容起到定位和过滤的效果原始字符串r,待匹配字符串中有反斜杠的时候,使用r能够忽视反斜杠带来的转义的效果点号默认情况匹配不到\n\s能够匹...
    99+
    2023-01-31
    爬虫 笔记 python
  • python培训Day3 随笔
    collections类这个类相当于一个扩展包,包含针对字典、列表、元组等数据类型的一些扩展操作。1、计数器Counter#计数器可以列出字符串和列表中元素出现的个数,并以字典返回>>> import collection...
    99+
    2023-01-31
    随笔 python
  • Python学习day3作业
    作业需求 HAproxy配置文件操作 根据用户输入,输出对应的backend下的server信息 可添加backend 和sever信息 可修改backend 和sever信息 可删除backend 和sever信息 操作配置文件前...
    99+
    2023-01-31
    作业 Python
  • day3 python 学习随笔
    三目运算(三元运算)例:result = 1 if 2 == 2 else 32. set是一个无序且不重复的元素集合3.生成器range不是生成器 和 xrange 是生成器readlines不是生成器 和 xreadlines 是生成器...
    99+
    2023-01-31
    随笔 python
  • Python学习记录day3
    Python学习记录 day3今天是银角大王武sir讲课。先回顾了上节课所学,然后讲到了面向对象思想。setset是一个无序且不重复,可嵌套的元素集合class set(object):     """     set() -> ne...
    99+
    2023-01-31
    Python
  • day3
    一、变量      变量名:   大前提是应该能够反映出变量值所记录的状态   变量名具体命名规范如下: 变量名是由字母、数字、下划线组成 不能以数字开头,也不能单独使用,只能结合字母和下划线 不能使用关键字命名变量名“and,as,a...
    99+
    2023-01-30
  • 从零开始学Python-day3
    Python--Day3学习要有定位,明确目标地去学习。---leavespython02---list知识一 list的概念    列表的概念:列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(所谓嵌套)。...
    99+
    2023-01-31
    从零开始 Python
  • Python——Day3知识点——文件操
     一、打开文件文件句柄 = open('文件路径', '模式')打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。打开文件的模式有:r,只读模式(默认)。w,只写模式。【不可读;不...
    99+
    2023-01-31
    知识点 文件 Python
  • Python Day3 集合 函数 文件
    set集合set是一个无序且不重复的元素集合class set(object):    """     set() -> new empty set object     set(iterable) -> new set obj...
    99+
    2023-01-31
    函数 文件 Python
  • 【C刷题】day3
    一、选择题 1、已知函数的原型是: int fun(char b[10], int *a); ,设定义: char c[10];int d; ,正确的调用语句是( ) A: fun(c,&d); B: fun(c,d); C: fun(&c...
    99+
    2023-09-26
    c语言 算法 数据结构
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作