函数
语法:
def 函数名(传入参数):
函数体
return 返回值
# 遍历字符串,并统计字符串的长度
str1 = "helloword"
str2 = "shen_mo_xie_xing"
count = 0
for i in str1:
count += 1
print(i, end=' ')
print()
print(f"字符串{str1}的长度是{count}")
count = 0
for i in str2:
count += 1
print(i, end=' ')
print()
print(f"字符串{str2}的长度是{count}")
# 使用函数来优化上面的代码
def my_len(data):
count = 0
for i in data:
count += 1
print(i, end=' ')
print()
print(f"字符串{data}的长度是{count}")
my_len(str1)
my_len(str2)
注意:
- 传入参数不需要的时候可以省略
- 返回值不需要的时候可以省略
- 函数必须先定义后使用
- 函数 == 方法 ,在面向对象的时候统一叫方法
- 函数的好处
- 将功能封装在函数内,可随时随地的重复利用
- 提高代码的复用性,减少重复代码,提高开发效率
- 函数的参数:在函数进行计算的时候,接受外部提供的数据,传入的参数不受数量限制
函数的返回值
# 定义一个函数
def add(x, y):
"""
函数说明
:param x: 形参x
:param y: 形参y
:return: 通过返回值,将结果返回给调用者
"""
res = x + y
return res
# 函数的返回值,可以用变量去接收
a = add(2, 6)
print(a)
# 无返回值的函数,返回的内容是None
def add_a():
print("Hello Word")
q = add_a()
print(q)
print(type(q))
# None用于if判断
def check_age(age):
if age >= 18:
return "已成年"
else:
return None
age = check_age(16)
print(age)
# None声明无内容的变量
name = None
print(type(name))
# 演示函数多个返回值
def test_return():
return 1, 'hello'
x, y = test_return()
print(x)
print(y)
注意:
- 函数体在遇到return后结束了,所以写在return后的代码不执行
- 无返回值的函数,返回的内容是None
- 函数的说明文档
- 通过多行注释,对函数进行说明解释,内容应写在函数体之前
- None类型的应用场景
- 用在函数无返回值上
- 用在if判断上,在if判断中,None == False
- 用于声明无内容的变量上
- 函数的多返回值:按照返回值的顺序,写对应顺序的多个变量接收即可
- 按照返回值的顺序,写对应顺序的多个变量接收即可
- 变量之间用逗号隔开
- 支持不同类型的数据return
函数的嵌套调用
def func_a():
print("输出func_a")
def func_b():
print("输出func_b")
func_a()
def func_c():
func_b()
print("输出func_c")
func_c()
注意:
- 函数的嵌套调用:指的是一个函数里面又调用了另一个函数
- 执行流程:函数A中执行到调用函数B的语句,会将函数B全部执行完成后,继续执行函数A的剩余内容
函数的作用域
def test_a():
# 定义局部变量
num = 100
print(num)
test_a()
# 在函数体外面访问局部变量会报错
# print(num)
# 定义一个全局变量
num = 200
def text_a():
print(num)
def text_b():
print(num)
text_a()
text_b()
print(num)
# 使用global关键字,在函数内部声明全局变量
num = 200
def text_a():
print(num)
def text_b():
global num # 设置内部定义的变量为全局变量
num = 500 # 修改内部定义的变量,全局变量也会改变
print(num)
text_a()
text_b()
print(num)
注意:
- 变量作用域:指的是变量的作用范围(主要分为局部变量和全局变量)
- 局部变量:定义在函数体内部的变量,只在函数体内部生效,当函数调用完成之后,则销毁局部变量
- 全局变量:在函数体内,外都能生效的变量
- global关键字:可以在函数内部声明变量为全局变量
函数的多种传参方式
# 演示位置参数
def user_info(name, age, gender):
print(f"你的名字是:{name},年龄是:{age},性别是:{gender}")
user_info('邪星', 21, '男')
# 演示关键字参数
def user_info(name, age, gender):
print(f"你的名字是:{name},年龄是:{age},性别是:{gender}")
# 关键字传参
user_info(name='邪星', age=21, gender='男')
# 可以不按照固定顺序
user_info(gender='男', name='邪星', age=21)
# 可以和位置参数混用
# 注意:函数调用时,如果有位置参数,位置参数必须在关键字参数的前面,但关键字参数之间不分先后顺序
user_info('邪星', gender='男', age=21)
# 演示缺省参数
def user_in(name, age, gender='男'):
print(f"你的名字是:{name},年龄是:{age},性别是:{gender}")
user_in('小王', age=21)
user_in('小天', age=14, gender='女')
# 演示不定长参数
# 传进的所有参数都会被args变量收集。它会根据传进参数的位置合并为一个元组
# 这个是位置传递的不定长参数
def user_fo(*args):
print(args)
user_fo('小王', 18)
# 关键字传递的不定长
# 参数是键值对形式的情况下,都会被kwargs接受,同时会组成字典
def user_io(**kwargs):
print(kwargs)
user_io(name='小乐', age=10, gender='男')
注意:
- 位置参数
- 调用函数时根据函数定义的参数位置来传递参数
- 传递的参数和定义的参数顺序及个数必须一直
- 关键字参数
- 函数调用的时候,可以通过 “键=值” 的形式传递参数
- 可以让函数更加清晰,容易使用,同时也清楚了参数的顺序需求
- 缺省参数
- 也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可以不传该默认参数的值
- 当调用函数时没有传递参数,就会使用默认是用缺省参数对应的值
- 不定长参数
- 也叫可变参数,用于不确定调用的时候回传多少个参数
- 当调用函数不确定参数个数时,可以使用
匿名函数
语法:lambda 传入参数: 函数体
# 定义一个函数,作为参数,传入另一个函数
def compute(x, y):
return x + y
# 定义一个函数,接收另一个函数作为传入参数
def text_func(compute):
rsa = compute(1, 2)
print(f"参数的类型是{type(compute)},结果是:{rsa}")
# 调用并输出
text_func(compute)
# 通过lambda关键字定义函数
def text_func(compute):
result = compute(1, 2)
print(result)
text_func(lambda x, y: x + y)
注意:
- 函数本身是可以作为参数,传入另一个函数中进行使用
- 将函数传入的作用在于:传入计算逻辑,而非传入数据
- 匿名函数:lambda关键字
- 有名称的函数可以重复使用
- 无名称的匿名函数,只可以临时使用一次
- 传入参数表示匿名函数的形式参数
- 函数体就是函数的执行逻辑,注意只能写一行
- def 和 lambda,定义的函数功能完全一致,只是lambda是匿名函数,无法二次使用
文件
语法:open (name,mode,encoding)
文件的读取:r 模式
# 打开文件
f = open('D:/测试.txt', 'r', encoding='UTF-8')
print(type(f))
# 文件对象.read(num)方法:表示要从文件中读取数据的长度,如果没有传入num,那么表示读取文件中所有的数据
print(f.read())
# 文件对象.readlines()方法:把整个文件进行一次性读取,并且返回的是一个列表,每一行的数据为一个元素
print(f.readlines())
# 文件对象.readline()方法:一次读取一行内容
print(f.readline())
# 文件对象.close()方法:关闭文件对象,也就是关闭对文件的占用
# 如果不调用close,同时程序没有停止运行,那么这个文件将一直被python程序占用
f.close()
# with open()语法:执行完语法里面的内容之后,自动关闭文件
with open('D:/测试.txt', 'r', encoding='UTF-8') as f:
for line in f:
print(f"每一行数据是:{line}")
注意:
- 使用open函数,可以打开一个已存在的文件,或者创建一个新文件
- name:设置文件的名字,或者打开文件的本地地址
- mode:设置打开文件的模式(访问模式):只读,写入,追加等
- r:以只读方式打开文件,这个是默认模式
- w:打开一个文件只用于写入,如果该文件已存在则打开文件,从头开始编辑,原有内容会被除 如果该文件不存在,创建新文件
- a:打开一个文件用于追加,如果该文件已存在,新的内容将会被写入到已有内容之后,如果该文件不存在,创建新文件进行写入
- encoding:编码格式(推荐使用UTF-8)
- readline() 方法可以重复调用,但是 read() 方法和 readlines() 方法,不推荐重复调用或者混合使用
- 除非你有那个需由,输出结果是什么样子,试一下就知道了
文件的写入或追加:w 模式 或 a 模式
# 打开文件
with open("D:/day.txt", "r", encoding="utf-8") as f:
# 文件对象.write()方法:文件的写入操作 或 追加操作
f.write("""打开文件,
写入文件,
追加文件
""")
# 文件对象.flush()方法:文件的刷新操作
f.flush()
注意:
- 当直接调用write,内容并不会真正写入文件,而是会积攒在程序中
- 调用flush的时候,内容才会真正的写入文件
- 这样操作是为了避免频繁的操作硬盘,导致效率下降
- 文件追加操作和文件写入操作完全一致,只不过是在a模式下进行
异常
语法:
try:
可能发生异常的语法
except:
如果出现异常执行的代码
else:
没有出现异常执行else的代码
finally:
无论有没有出现异常都要去执行
try:
a = 1 / 0
except Exception as e:
print("出现异常")
else:
print("没有出现异常")
finally:
print("这是个异常计算")
注意:
- 异常就是BUG
- 在可能发生异常的地方,进行捕获,当出现异常提供解决方式,而不是任由其发生导程序无法运行
- else 和 finally是可选的,可以写也可以不写
- 捕获异常的作用在于:提前假设某处会出现异常,做好提前的准备,当真的出现异常时,可以有后续手段
- 捕获指定异常:在 except 后面加上 异常的类型,也可以添加多个异常类型,即为捕获多个异常
- 如果出现的异常不是指定捕获的异常,结果还是会报错
- 捕获所有异常:在 except 后面 写上Exception,这个是异常的顶级父类,包含所有异常
模块与包
*语法:[from 模块名] import [模块 | 类 | 变量 | 函数 | ] [as 别名]
[ ] 里面是可选内容
# 使用import导入time模块使用sleep功能
import time
print('开始')
time.sleep(5)
print('结束')
# 使用from导入time的sleep功能
from time import sleep
print('开始')
sleep(5)
print('结束')
# 使用*导入time模块全部功能
from time import *
print('开始')
sleep(5)
print('结束')
# 使用as给特定功能加上别名
import time as m
print('开始')
m.sleep(2)
print('结束')
注意:
- 模块
- 是一个python文件,以.py结尾,模块能定义函数,类和变量,模块里也能包含可执行的代码
- 作用:每一个模块都可以帮助我没快速实现一些功能,可以认为一个模块就是一个工具包
- Python的自定义模块:正常写代码即可,通过import,from关键字和导入Python内置模块一样使用
- 当导入多个模块的时候,且模块内有同名功能,当调用这个功能时,调用的是后导入的模块
- 常见组合形式
- import 模块名
- from 模块名 import 类, 变量, 方法等
- **from 模块名 import ***
- import 模块名 as 别名
- from 模块名 import 功能名 as 别名
- 包
- 从物理上看就是一个文件夹,从逻辑上看,本质依然是模块
- 当模块文件越来越多时,包可以帮助我们管理这些模块
- 导入包语法:
- import包名.模块名
- 包名.模块名.目标
- init.py文件的作用: 通过这个文件来表示,这个文件夹是python包,而非普通文件夹
- python安装第三方包的语法:
- 直接用外网安装: pip install 包名称
- 通过国内第三方网站安装: pip install -i https://pypi.tsinghua.edu.cn/simple 包名称
json数据格式
语法:import json模块
# 导入json模块
import json
# 列表里面嵌套字典的列表
data = [{"name": "老王", "age": 23}, {"name": "张三", "age": 20}]
# json.dumps(元素)方法:把python数据转换为json数据
z = json.dumps(data, ensure_ascii=False)
print(f"将python数据转换为json数据:{z},数据类型是:{type(z)}")
# json.loads(元素)方法:把json数据转换为python数据
x = json.loads(z)
print(f"将json数据转换为python数据:{x},数据类型是:{type(x)}")
# 字典
s = {"name": "老王", "age": 23}
a = json.dumps(s, ensure_ascii=False)
print(f"将字典数据转换为json数据:{a},数据类型是:{type(a)}")
b = json.loads(a)
print(f"将json数据转换为字典:{b},数据类型是:{type(b)}")
标签:03,函数,文件,Python,age,笔记,参数,print,def From: https://www.cnblogs.com/shenmo-xiexing/p/18048477注意:
- Json的数据格式是一种轻量级的数据交互格式,采用完全独立编程语言的文本格式来存储和表示数据,本质上是一个带有特定格式的字符串
- 主要功能:是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传传递和交互,json可以直接和python进行无缝转换
- 如果数据有中文,可以添加 ensure_ascii=False 参数来确保中文正常装换
- json的数据格式有两种,字典或者是内部元素全是字典的列表