Python中的函数知识汇总(匿名函数,递归函数等),文件基本操作,os模块,json模块,将文件存储成excel文件

1.函数的定义声明和调用:


# 如何创建函数?定义函数时,函数内容并不会执行
# 函数的输入专业叫参数, 函数的输出叫返回值。
# 重点:
#       - 形参: 形式参数,不是真实的值(定义函数时的参数)
#       - 实参:实际参数, 是真实的值(调用函数时的参数)
def get_max(num1, num2):
    result = num1 if num1 > num2 else num2
    return result
# 如何调用函数?
max_num = get_max(30, 80)
print(max_num)  #80


2.函数变量的作用域:

可变数据类型:  list, dict,  set
不可变数据类型: 数值型, str, tuple

# 1. 全局变量: 全局生效的变量。函数外面的变量。
name = 'admin'
def login():
    print(name)  #admin
login()

# 2. 局部变量: 局部生效的变量。函数内部的变量。
def logout():
    age = 19
    print(age) #19
logout()
# print(age)


# 3. 在函数内部修改全局变量.
# 1). money是全局变量
# 2). 如果要在函数中修改全局的变量,不能直接修改。 需要用global关键字声明修改的变量是全局变量。
# 3). 不可变数据类型修改全局变量一定要global声明, 可变数据类型不需要。
def hello():
    global money
    money += 1
    users.append('user1')
    print(money, users)
money = 100  # 不可变数据类型
users = []  # 可变数据类型
hello()   #101 ['user1']


3.函数的参数传递:

3-1:

参数检查 : isinstance(var, int) 判断变量var是否为int
定义函数时,使用两个“ ” “ 之间的内容可以作为函数的帮助, 可以使用print(help(函数名)) 查看函数帮助;

例如:

def get_max(num1:int, num2:int)->int:  #可以在形参后面加上数据类型更为规范
    """
    求两数的最大值
    :param num1: 整型数1
    :param num2: 整型数2
    :return: 最大值
    """
    if isinstance(num1, int) and isinstance(num2, int):
        return num1 if num1 > num2 else num2
    else:
        return  0
result = get_max(20, 30)
print(result)  # 30
print(help(get_max))  #get_max(num1:int, num2:int) -> int
                      #求两数的最大值
                      #:param num1: 整型数1
                      #:param num2: 整型数2
                      #:return: 最大值

3-2:常见的四种形式参数


"""
必选参数:必须要传递的参数
默认参数:
可变参数:*args - 元组
关键字参数:**kwargs - 字典
"""


# 1. 必选参数:必须要传递的参数
def get_max(num1: int, num2: int) -> int:
    return num1 if num1 > num2 else num2


result = get_max(20, 30)
print(result) #30


# 2. 默认参数:可传可不传的参数,不传时为默认值
def pow(x, y=2):
    return x ** y

result = pow(3)  # x=3, y=2, result=9
print(result)  #9

result = pow(2, 4)  # x=2,y=4, result=2**4=16
print(result) #16


# 3. 可变参数: 参数的个数会变化(个数不确定),可以传0,1,2,3,......n个参数
# args是元组
# args=arguments
def my_sum(*args):
    return sum(args)

result = my_sum(4, 5, 6)  # 15
print(result)

# 4. 关键字参数:可以传递key和value
# kwargs存储在字典中
def enroll(name, age=18, **kwargs):
    print(f"""
        入学信息
    1. 姓名:{name}
    2. 年龄:{age}
    3. 其他:{kwargs}
    """)

enroll('张三', country='china', english='GRE', sports=['篮球', '羽毛球'])

# 入学信息
# 1.姓名: 张三
# 2.年龄: 18
# 3.其他: {'country': 'china', 'english': 'GRE', 'sports': ['篮球', '羽毛球']}



4.匿名函数:

匿名函数是指一类无需定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需声明(不用def定义声明)

lambda语法中, :(冒号) 前面的为函数的输入,冒号后面的为函数的输出; 示例如下:


# def get_max(num1: int, num2: int) -> int:
#     return num1 if num1 > num2 else num2
#  上两行的函数可以用匿名函数:
get_max = lambda num1, num2: num1 if num1 > num2 else num2
print(get_max(10, 20))  # 20

# def pow(x, y=2):
#     return x ** y
pow = lambda x, y=2: x ** y
print(pow(4))  # 4**2 16
print(pow(2, 3)) # 2**3 8

匿名函数用法示例:


"""
给定一个整形数组, 将数组中所有的0移动到末尾, 非0项保持不变;
    - 输入: 数组的记录;0 7 0 2
    - 输出: 调整后数组的内容; 7 2 0 0
    要求在同一个数组中实现,不创建新的数组
0 7 0 2  -before sort
=====
1 0 1 0  - rule: (1 if num==0 else 0)
0 0 1 1
=====
7 2 0 0  -after sort
"""
nums = [0, 7, 0, 2]
nums.sort(key=lambda num: 1 if num==0 else 0)
print(nums) #[7, 2, 0, 0]


# 需求: 将所有的偶数排前面,所有的奇数排后面。
nums = [0, 7, 0, 2]
nums.sort(key=lambda num: 0 if num%2==0 else 1)
print(nums)  #[0, 0, 2, 7]

练习:有一个整数列表(10个元素), 要求调整元素的顺序,把所有的奇数放在前面,偶数放在后面


d = [1, 4, 3, 2, 6, 9, 8, 7, 5, 0]
d.sort(key=lambda de : 1 if de%2==0 else 0) #由于是对列表排序,所以lambda 冒号前面的输入均为列表内的值,所以名字可以任意;
print(d)


5.递归函数:

递归函数:函数自身调用自身
书写递归函数的关键点:

  • 递归的规律
  • 退出递归的条件

经典示例:递归函数求阶乘:


方法1: 常规方法:for循环
res = 1
n = 3  # 3!=3*2*1=1*2*3=6
for i in range(1,n+1):
    res = res * i # res=1*1*2*3
print(res)

方法2: 递归
3! = 3 * 2! = 3 * 2 * 1! = 6
n! = n*(n-1)! = n*(n-1)*(n-2)! = n*(n-1)*...*1!
规律:n! = n*(n-1)! = n*(n-1)*(n-2)! = n*(n-1)*...*1!
结束条件:n = 1
代码:
def f(n):
    """计算阶乘"""
    if n == 1:
        return  1
    return n * f(n-1)

print(f(5))  # 120 

示例2: 递归函数求斐波那切数列:
规律: n = n-1 + n-2
结束条件: n = 1 或 n = 2

求斐波那切数列中的第6个数是多少?


def fib(n):
    """fib数列"""
    if n == 1 or n == 2:
        return  1
    return  fib(n-1) + fib(n-2)

# 1, 1, 2, 3, 5, 8
print(fib(6)) # 8

6.文件的基本操作:

6-1 :

文件基本操作图示:
在这里插入图片描述


# 1. 打开文件
"""
mode:
    r: 只能读文件
    w: 只能写入(清空文件内容)
    a+: 读写(文件追加写入内容)
"""
f = open('doc/hello.txt', mode='a+')  # 相对路径
# 2. 文件读写操作
f.write('java\n')
# 3. 关闭文件
f.close()

6-2: with 语句:


"""
with语句:  能够自动关闭文件( close( ) )
"""
# ****with语句
with open('doc/test.txt', 'w+') as f:  #将打开的文件暂时命名为f
    f.write('hello world\n') # 写入文件
    f.seek(0, 0)      # ****: 移动指针到文件最开始
    print("当前指针的位置:", f.tell())
    print(f.read())         # 读取文件内容  hello world
    f.seek(0, 2)      # 移动指针到文件末尾
    print("当前指针的位置:", f.tell())
    print(f.read())         # 读取文件内容  nothing


7:OS模块:

os,即操作系统,处理操作系统相关的功能,可跨平台。例如:显示当前目录下所有文件/删除某个文件/获取文件大小等…

OS模块常用的相关操作:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述


import  os
import platform
# 1. 获取操作系统类型
print(os.name)
# 2. 获取主机信息,windows系统使用platform模块, 如果是Linux系统使用os模块
"""
try: 可能出现报错的代码
excpt: 如果出现异常,执行的内容
finally:是否有异常,都会执行的内容
"""
try:
    uname = os.uname()
except Exception:
    uname = platform.uname()
finally:
    print(uname)

# 3.获取系统的环境变量
envs = os.environ
# os.environ.get('PASSWORD')
print(envs)

# 4. 目录名和文件名拼接
# os.path.dirname获取某个文件对应的目录名
# __file__当前文件
# join拼接, 将目录名和文件名拼接起来。
BASE_DIR = os.path.dirname(__file__)  #表示打印生成当前文件所在的目录名,当前文件(__file__)
setting_file = os.path.join(BASE_DIR, 'dev.conf')
print(setting_file)



8.json模块:

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。通俗来讲就是可以通过 json 让不同语言中存储的数据实现共通。

在这里插入图片描述
在这里插入图片描述


import  json

# 1. 将python对象编码成json字符串
users = {'name':'westos', "age":18, 'city':'西安'}
json_str = json.dumps(users)  #json.dumps, 不用存储在文件中
with open('doc/hello.json', 'w') as f:
    # ensure_ascii=False:中文可以成功存储
    # indent=4: 缩进为4个空格
    json.dump(users, f, ensure_ascii=False, indent=4)  #json.dump, 存储在文件中
    print("存储成功")
print(json_str, type(json_str)) #{"name": "westos", "age": 18, "city": "\u897f\u5b89"} <class 'str'>

# 2. 将json字符串解码成python对象
with open('doc/hello.json') as f:
    python_obj = json.load(f)
    print(python_obj, type(python_obj)) #{'name': 'westos', 'age': 18, 'city': '西安'} <class 'dict'>

9.将文件存储为excel文件:

需要在terminal中安装:

安装pandas
 pip install pandas -i https://pypi.douban.com/simple
安装对excel操作的模块
 pip install openpyxl -i https://pypi.douban.com/simple

示例:


import pandas
hosts = [
    {'host':'1.1.1.1', 'hostname':'test1', 'idc':'ali'},
    {'host':'1.1.1.2', 'hostname':'test2', 'idc':'ali'},
    {'host':'1.1.1.3', 'hostname':'test3', 'idc':'huawei'},
    {'host':'1.1.1.4', 'hostname':'test4', 'idc':'ali'}
]
# 1. 转换数据类型
df = pandas.DataFrame(hosts)
print(df)  #会将输出转换为二维形式的输出

# 2. 存储到excel文件中
df.to_excel('doc/hosts.xlsx') #.xlsx为excel文件后缀
print('success')

转换数据类型后的输出如图:
在这里插入图片描述
存储到excel中的结果如图:
在这里插入图片描述



词频统计练习:

"""
技能需求:
    1. 文件操作
    2. 字符串的分割操作
    3. 字典操作
功能需求:词频统计
    1. 读取song.txt文件   with open(filename) as f: content=f.read()
    2. 分析文件中的每一个单词,统计每个单词出现的次数。{"hello":2, "python":1, "java":1}
    - 分析文件中的每一个单词
    content = "hello python hello java"
    words = content.split()
    - 统计每个单词出现的次数- {"hello":2, "python":1, "java":1}
    # words = ['hello', 'python', 'hello', 'java']
    3. 获取出现次数最多的5个单词

"""
方法一:遍历:
with open('doc/song.txt') as f :
    words = f.read().split()

result = {}
for word in words:
    if word in result:
        result[word] += 1
    else:
        result[word] = 1
# 拓展: 友好打印信息
import pprint
pprint.pprint(result)


方法二:导入计数模块:
# 1. 加载文件中所有的单词
with open('doc/song.txt') as f:
    words = f.read().split()
# 2. 统计
from collections import  Counter
counter = Counter(words) #统计出现的次数
result = counter.most_common(5) #统计出现次数最多的前5个
print(result)

方法一结果:
在这里插入图片描述
方法二结果:

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值