首页 > 技术文章 > python课程总结day11

liangxiaoying 2021-06-09 21:43 原文

今日内容

控制文件指针移动

# f.seek移动的全都是字节个数
# f.seek(字节个数,0)
# f.seek(字节个数,1)
# f.seek(字节个数,2)

# ps:只有0模式可以t下使用,其中1和2模式只能在b模式下使用,但是无论在t模式还是b模式下,移动的都是字节个数

# with open('a.txt',mode='rt',encoding='utf-8') as f:
#     print(f.tell())
#     # f.seek(9,0)
#     # f.seek(3,0)
#
#     print(f.tell())


# with open('a.txt',mode='rb') as f:
#     print(f.tell())
#     f.seek(9,1)
#     f.seek(3,1)
#
#     print(f.tell())

# with open('a.txt',mode='rb') as f:
#     print(f.tell())
#     f.seek(0,2)
#
#     print(f.tell())

# with open('a.txt',mode='ab') as f:
#     print(f.tell())


tail程序实现

with open('access.log', mode='rb') as f:
    f.seek(0, 2)

    while True:
        line = f.readline()

        if len(line) == 0:
            continue
        else:
            print(line.decode('utf-8'),end='')

修改文件的两种方式

# with open('test.txt', mode='r+t', encoding='utf-8') as f:
#    f.seek(9,0)
#    f.write("hello")


# 文件修改的原理:
# 把硬盘数据读入内存,在内存修改完毕后,再覆盖回硬盘

# 具体来说又分为两种方案
# 方案一:
# with open('test.txt',mode='rt',encoding='utf-8') as f:
#     data = f.read()
#
# with open('test.txt',mode='wt',encoding='utf-8') as f:
#     f.write(data.replace('egon','EGON'))


# 方案二:
import os

with open('test.txt',mode='rt',encoding='utf-8') as f1,\
        open('.test.txt.swp',mode='wt',encoding='utf-8') as f2:
    for line in f1:
        f2.write(line.replace('EGON',"egon"))

os.remove('test.txt')
os.rename('.test.txt.swp','test.txt')

定义与调用函数

一、函数是什么
    函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段。
    要想用函数,需要先定义,再使用
    
一、 为何要用函数之不用函数的问题
    1、代码的组织结构不清晰,可读性差
    2、遇到重复的功能只能重复编写实现代码,代码冗余
    3、功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一管理且维护难度极大
    
 三、如何定义函数
     def 函数名(参数1,参数2,参数3,...):
        '''注释'''
        函数体
        return 返回的值

四、 函数使用的原则:先定义,再调用
1.函数即“变量”,“变量”必须先定义后引用。未定义而直接引用函数,就相当于在引用一个不存在的变量名
#测试一
def foo():
    print('from foo')
    bar()
foo() #报错

#测试二
def bar():
    print('from bar')
def foo():
    print('from foo')
    bar()
foo() #正常

#测试三
def foo():
    print('from foo')
    bar()
    
def bar():
    print('from bar')
foo() #会报错吗?


#结论:函数的使用,必须遵循原则:先定义,后调用
#我们在使用函数时,一定要明确地区分定义阶段和调用阶段

#定义阶段
def foo():
    print('from foo')
    bar()
def bar():
    print('from bar')
#调用阶段
foo()

2.函数的定义阶段
#只检测语法,不执行代码
也就说,语法错误在函数定义阶段就会检测出来,而代码的逻辑错误只有在执行时才会知道

五、函数的调用
1 语句形式:foo()
2 表达式形式:3*len('hello')
3 当中另外一个函数的参数:range(len('hello'))

函数的参数

# def add(x,y):
#     res = x + y
#     print(res)
#
# add(1,2)


# def func(x, y):
#     if x > y:
#         print(x)
#     else:
#         print(y)
#
#
# func(11231231231, 22123123123213)

# def login(inp_user,inp_pwd):
#     if inp_user == 'egon' and inp_pwd == "123":
#         print('ok')
#     else:
#         print('error')
#
#
# login('egon',"123")


# l = [111, 222, 333, 444, 555]
#
# size = len(l)
# if size > 3:
#     print('ok')
# else:
#     print('no')


# def max2(sal1, sal2):
#     if sal1 > sal2:
#         return sal1
#     else:
#         return sal2
#
# res = max2(1000,2000)
# print(res * 12)

# l = [111, 22, 333]
# res = l.append(4444)
# res = l.pop()
# print(res)

# return返回值的语法:
# 函数内可以有多个return,但只要执行一次,整个函数就立即结束,并且将return后的值当作本次调用的产品返回

# def func():
#     print('aaaa')
#     return 11111111111111
#     print('bbbb')
#     return 2222222222
#     print('cccc')
#     return 333333333
#
# res = func()
# print(res)

# 具体来说函数的返回值有三种形式
# 1 return 值: 返回的就是改值本身/-
# 2 return 值1,值2,值3:返回的是小元组
# def func():
#     return 1111,"aaa",[11,222]
#
# x,y,z = func()
# print(x,y,z)

# # 3 没有return或者return无值或者return None:返回的都是None
# def func():
#     res = 1 + 2
#     return
#
# res = func()
# print(res)

函数的返回值

无return->None
return 1个值->返回1个值
return 逗号分隔多个值->元组

什么时候该有返回值?
    调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
    通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
什么时候不需要有返回值?
    调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值
    通常无参函数不需要有返回值

模块的使用

"""
1 什么是模块
    模块一系列功能的集合体

    模块分为四种通用的类别
      1 使用python编写的.py文件

      2 已被编译为共享库或DLL的C或C++扩展

      3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)

      4 使用C编写并链接到python解释器的内置模块

    模块有三种来源:
        1 python自带的模块/库
            内置模块
            标准库

        2 第三方的库

        3 自定义库

2 为何要用模块
    1 拿来主义,提升开发效率
    2 减少代码冗余

3 如何用模块
    import
    from ... import
"""

# import spam

# print(spam.x)
# print(spam.f1)
# print(spam.f2)

# def f1():
#     print('xxxxxxxx')

# spam.f1()
# spam.f2()


# from spam import x,f1,f2

# def f1():
#     print('xxxxx')

# f1()

常用模块

# 一 time模块
import time

# 时间戳
# print(time.time())

# 格式化的字符
# print(time.strftime('%Y-%m-%d %H:%M:%S'))

# 结构化的时间
# obj = time.localtime()
# print(obj.tm_year)
# print(obj.tm_yday)
# print(obj)

# obj2 = time.gmtime()  # utc
# print(obj2)

# 二 random模块
import random

# print(random.random())
# print(random.randint(1,3))
# print(random.randrange(1,3))
# print(random.choice([11,"aaa",333]))
# print(random.sample([11,"aaa",333,444],2))

# print(random.uniform(1, 3))

# item=[1,3,5,7,9]
# random.shuffle(item)
# print(item)


# 储备知识
# print(chr(65))
# print(chr(90))
#
# print(ord('A'))
# print(ord('Z'))


import random

def make_code(size):
    res = ''
    for i in range(size):
        num = str(random.randint(0,9))
        s = chr(random.randint(65,90))
        res += random.choice([num,s])
    return res


print(make_code(6))

推荐阅读