自动化运维Python系列(三)之基础函数和文件操作

函数作用

增强代码的重用性和可读性

在没有使用函数编程之前,我们可能一直遵循的都是面向过程编程,即根据业务逻辑从上到下实现各个功能,这样的做的坏处是代码可读性不强,大量冗余代码,而且执行效率不高;有了函数后,我们就可以将多次使用到的相同代码模块放在单独的函数定义中,在任何想要调用它的地方随时调用,这就叫做函数式编程。

面向对象编程其实就是对函数进行再分类和封装,让开发"更快更好更强..."

函数的定义

def 函数名(参数):

...

函数体

...

返回值

函数的定义主要有如下要点:

1)def:表示函数的关键字

2)函数名:函数的名称,日后根据函数名调用函数

3)函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...

4)参数:为函数体提供数据

5)返回值:当函数执行完毕后,可以给调用者返回数据

函数参数

可以对Python函数传以下几种形式的参数:

1、普通参数(严格按照顺序,将实际参数赋值给形式参数)
2、默认参数(必须放置在参数列表的最后)
3、指定参数(将实际参数赋值给指定的形式参数)
4、动态参数:
   *        默认将传入的参数,全部放置在元组中
   **       默认将传入的参数,全部放置在列表中

5、万能参数 *args,**kwargs

这几种参数原理有点类似字符串的格式化输出

# str.format() 格式化输出
s1 = "i am {0}, age {1}".format("kobe",18)
print(s1)
s2 = "i am {0}, age {1}".format(*["kobe",18])
print(s2)
s3 = "i am {name}, age {age}".format(name=‘kobe‘,age=‘18‘)
print(s3)
dic_01 = {‘name‘:‘kobe‘,‘age‘:18}
s4 = "i am {name}, age {age}".format(**dic_01)
print(s4)
输出:
i am kobe, age 18
i am kobe, age 18
i am kobe, age 18
i am kobe, age 18

1)普通参数

def login(user,pwd):
  print(user,pwd)
login(user,pwd)

2)默认参数

def login(user="kobe", pwd=123):
    print(user,pwd)
login()

3)指定参数

def login(user, pwd):    print(user,pwd)
login(pwd=123, user="kobe")
#指定参数的话,参数顺序就可以随便

4)动态参数

*args 一个星号

def f1(*args):
   print(args,type(args))
f1(11,22,‘hhhh‘)li = [22,33,‘hehe‘]f1(li,‘44‘)f1(*li)  # 给全部的参数作为元组的每一个元素添加lii = ‘kobe‘f1(*lii)  # 循环字符串每一个元素
输出
(11, 22, ‘hhhh‘) <class ‘tuple‘>  # 函数接受所有参数,还是原来的元组
([22, 33, ‘hehe‘], ‘44‘) <class ‘tuple‘> # 函数接受列表元素,并将他的整体作为一个元组的一部分
(22, 33, ‘hehe‘) <class ‘tuple‘> # 用一个星号可以将列表中的每一个元素添加进元组
(‘k‘, ‘o‘, ‘b‘, ‘e‘) <class ‘tuple‘> # 字符串循环的话,是每一个字符

**args 两个星号

def f2(**args):    print(args,type(args))f2(n1="kobe")dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘}f2(kk=dic)   # 只有一个键值对f2(**dic)
输出
{‘n1‘: ‘kobe‘} <class ‘dict‘> # 两个星号动态参数会将键值保存为字典
{‘kk‘: {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘}} <class ‘dict‘> # 传字典参数要是不加两个**,只会出现一个键值对
{‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘} <class ‘dict‘> # 传字典参数,正确做法是加两个**

混合传参

def f3(*args,**kwargs):     # 万能参数只能放置在args后    print(args)    print(kwargs)
f3(11,22,33,k1="v1",k2="v2")
输出
(11, 22, 33) # Python会自动将列表通过*args接收为元组
{‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘} # 键值对会自动通过**args接收为字典

函数扩展01:重复函数定义

def f4(a1,a2):    return a1 + a2def f4(a1,a2):    return a1 * a2ret = f4(8,8)
print(ret)
输出
64
# 原因是因为Python执行代码自上而下,之前被执行的 a1+a2 =16由于在内存中没人使用,很快会被Python的垃圾回收机制所回收

函数扩展02:函数传参是原值引用还是重新创建的新值?

def f5(a1):    a1.append(999)li_01 = [11,22,33]f5(li_01)
print(li_01)
输出
[11, 22, 33, 999]
# 结果表明函数传参是使用的引用,增加的话会改变原列表

函数扩展03:全局变量

NAME = "kobe"      
# 全局变量(潜规则:全局变量都用大写)
def f6():    
    age = 18       
# 局部变量    
    global NAME    
# 修改全局变量
# 如果需要修改的变量是一个列表,则在函数里面可以读,可以append添加
但是不可以修改或者赋值    
    name = "jordan"    
    print(NAME,age)
f6()
输出
kobe 18

Python的内置函数

# abs取绝对值

n = abs(-1)

# all() 所有元素为真则为真

n = all([1, 2, 3, 4])
print(n)

# any() 只要有真则为真

n = any([1, 0, None])
print(n)

# ascii() 自动执行对象的__repr__方法
   
# bin() 10进制转换成2进制
# oct() 10进制转换成8进制
# hex() 10进制转换成16进制
  
# bool值

# 0,None,"",[],{},() 都为False
print(bool(0))

bytes()

# bytes()字符串转换字节类型
# bytearray()字符串转换字节生成列表
# utf-8 一个汉字占用3个字节
# gbk 一个汉字占用2个字节
# 真是这个原因才导致很多gbk文件用utf-8打开会出现乱码
s = "李杰"
n = bytes(s, encoding="utf-8")
print(n)
输出
b‘\xe6\x9d\x8e\xe6\x9d\xb0‘

# 将字节转换成字符串

n = str(bytes(s, encoding="utf-8"), encoding="utf-8")
print(n)
输出
李杰

函数示例小程序:用户登陆注册

def login(user,pwd):
    """
    用户用户登陆验证
    :param: user 用户名
    :param: pwd  密码
    :return: Ture 登陆成功 False 登陆失败
    """
    f = open(‘db‘,‘r‘)
    for line in f:
        if line.split(‘|‘)[0] == user and line.split(‘|‘)[1] == pwd:
            return True
    return False
def register(user, pwd):
    """
    用户用户注册
    :param user: 用户名
    :param pwd: 密码
    :return: 默认None
    """
    f = open(‘db‘, ‘a‘)
    temp = "\n" + user + "|" + pwd
    f.write(temp)
    f.close()
def main():
    select = input("请选择:【1】登陆 【2】注册 :")
    if select == "1":
        print("正在登陆...")
        user = input("请输入用户名: ")
        pwd = input("请输入密码: ")
        ret = login(user, pwd)
        if ret is True:
            print("登陆成功!")
        else:
            print("登陆失败!")
    if select == "2":
        print("正在注册...")
        user = input("请输入用户名: ")
        pwd = input("请输入密码 ")
        ret = register(user, pwd)
        print("注册成功!")
main()

三元运算&三目运算

# 三元运算 通过一条命令代替if else语句

if 1==1:
    name = "kobe"
else:
    name = "jordan"
name = "kobe" if 1 == 1 else "jordan"

# lambda表达式

def f1(a1):
    return a1 + 100
f2 = lambda a1, a2: a1 + a2
ret = f1(10)
ret2 = f2(100,10)
print(ret,ret2)
输出
110 110

文件操作

1)打开文件

# f = open(‘db‘, ‘r‘)  # 只读
# f = open(‘db‘, ‘w‘)  # 只写,先清空
# f = open(‘db‘, ‘x‘)  # python 3.0 新加(如果文件存在报错,不存在则创建并写内容)
# f = open(‘db‘, ‘a‘)  # 追加
# f = open(‘db‘, ‘r‘, encoding="utf-8")  # 指定字符编码,防止乱码
# f = open(‘db‘, ‘rb‘)  # 以二进制打开

r+ a+ w+的区别

# r+ 能调整写文件指针位置,其他的总是写到末尾
# a+ 能读,但是写文件只能在末尾添加
# w+ 会先清空文件再写
f = open(‘db‘, ‘r+‘, encoding="utf-8")  # 如果模式没有加 b 中文默认按照一个字符读取数据
data = f.read(1)
f.seek(3)   # 调整文件指针到执行位置(以字节方式查找)
print(f.tell())
f.write("777")  # 会覆盖已经存在的元素

2)操作文件

f.read()  # 无参数默认读全部;有参数(b按字节;无b按字符)
f.tell()  # 查看指针位置
f.seek()  # 按字节调整指针位置
f.write()  # 写文件
f.close()  # 关闭
f.fileno()  # 文件的描述符
f.flush()  # 强刷文件到硬盘
f.readable()  # 是否可读
f.readline()  # 仅读取一行
f.truncate()  # 截断指针后面的所有数据

for循环文件对象

for line in f:
    print(line)

关闭文件

f.close()
with open(‘db‘) as f:
    pass

同时打开两个文件

with open(‘db01‘) as f1, open(‘db02‘) as f2:
    pass
时间: 2024-12-14 11:26:05

自动化运维Python系列(三)之基础函数和文件操作的相关文章

自动化运维Python系列(一)之基础篇

Python介绍 Python是由创始人吉多·范罗苏姆(Guido van Rossum)在1989年圣诞节假期期间,为了打发时间,构思出来的一个新的脚本解释器.由于Guido在开发Python语言过程中,借鉴了很多ABC语言特性,所有后来包括Guido自己也那么认为,Python语言的前身就是ABC语言. Python是一门面向对象的.动态解释型强定义语言:Python崇尚简洁.优美.清晰,是一门优秀的被广泛使用的语言. 在2015年以前,最流行的Python版本还是2.4,但是由于Pytho

自动化运维Python系列之ForeignKey、relationship联表查询

一对多和多对多 数据库表结构设计是程序项目开发前的重要环节,后期数据库操作都是围绕着这个已经设计好的表结构进行,如果表结构设计有问题,整个程序项目就有存在需要整个推翻重构的风险... 数据库表结构除了简单的单表操作以外,还有一对多.多对多等. 一对多 基于SQLAlchemy我们可以先创建如下结构的2张表,然后来看看具体怎样通过外键ForeignKey或者relationship联表操作 创建表 from sqlalchemy.ext.declarative import declarative

自动化运维Python系列之Django信号、缓存操作

Django信号 Django内部提供了一种"信号强度"处理机制,简单理解就是当Django在接收到请求后内部做某些特定操作前发出信号,提醒一些接受者或者做操作,这样的好处就是方便程序定制小功能插件,也是对本身框架的一种节藕操作 1)Django的内置信号 Model signals     pre_init                # django的modal执行其构造方法前,自动触发     post_init               # django的modal执行其构

自动化运维Python系列之Django进阶操作

FBV && CBV FBV.CBV是Django视图路由处理模型,当用户请求送达路由系统URL后,由其转发给视图view来分析并处理 // FBV    function base views  // CBV    class base views 区别就是一个直接用函数驱动,一个用类驱动,两者在使用上存在一些区别 1)FBV URL中根据路由匹配直接转发给视图中的某一个处理函数 urlpatterns = [     url(r'^home/', views.home), ] 视图函数

自动化运维Python系列(二)之基础数据类型

一.列表和元组 列表是我们最常用到的数据类型之一,在一个变量中定义多个变量,可以理解为数组 定义列表 >>> name = ["liunx01","linux02","Unix",22] >>> print(name) ['liunx01', 'linux02', 'Unix', 22] >>> name[0] 'liunx01' >>> name[-1] 步长 >&g

自动化运维Python系列(七)之Socket编程

了解知识点TCP\IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准, 从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议是指因特网整个TCP/IP协议族.不同于ISO模型的七个分层,TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中(数据链路层和物理

自动化运维Python系列之Memcache、Redis操作

Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memcached安装 wget http://memcached.org/latest tar -zxvf memcach

自动化运维Python系列(五)之常用模块

模块 用一坨代码实现了某个功能的代码集合 模块分为三种 · 自定义模块 · 第三方模块 · 内置模块 1)自定义模块 自己编写并存在在某个路径下的python程序,实现了某个功能,可以被其他程序调用 2)第三方模块 网络上下载并能兼容当前Python版本的第三方程序模块,比如支持HTTP测试的requests库 3)内置模块 C:\Python3.5\Lib目录下的py文件大部分都是Python的内置模块,如sys.os.time等 导入模块 import module from module.

自动化运维Python系列(四)之装饰器和生成器

装饰器 在理解什么事装饰器之前,我们需要理解:函数也是一个对象,可以赋值给变量,通过变量来调用 def f1():     print('2016') d = f1 d() 输出: 2016 那么装饰器的作用就是在不改变原函数的前提下,调用这些函数,并且为函数增加我们需要的新功能. 我们平时在编写好很多独立函数模块以后,突然需要在每个模块内添加一个功能,比如: def f1():     print('F1') def f2():     print('F2') def f3():     pr