Python学习笔记03

函数

语法:
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)

注意:

  1. 传入参数不需要的时候可以省略
  2. 返回值不需要的时候可以省略
  3. 函数必须先定义后使用
  4. 函数 == 方法 ,在面向对象的时候统一叫方法
  5. 函数的好处
    1. 将功能封装在函数内,可随时随地的重复利用
    2. 提高代码的复用性,减少重复代码,提高开发效率
  6. 函数的参数:在函数进行计算的时候,接受外部提供的数据,传入的参数不受数量限制

函数的返回值

# 定义一个函数
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)

注意:

  1. 函数体在遇到return后结束了,所以写在return后的代码不执行
  2. 无返回值的函数,返回的内容是None
  3. 函数的说明文档
    1. 通过多行注释,对函数进行说明解释,内容应写在函数体之前
  4. None类型的应用场景
    1. 用在函数无返回值上
    2. 用在if判断上,在if判断中,None == False
    3. 用于声明无内容的变量上
  5. 函数的多返回值:按照返回值的顺序,写对应顺序的多个变量接收即可
    1. 按照返回值的顺序,写对应顺序的多个变量接收即可
    2. 变量之间用逗号隔开
    3. 支持不同类型的数据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()

注意:

  1. 函数的嵌套调用:指的是一个函数里面又调用了另一个函数
  2. 执行流程:函数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)

注意:

  1. 变量作用域:指的是变量的作用范围(主要分为局部变量和全局变量)
    1. 局部变量:定义在函数体内部的变量,只在函数体内部生效,当函数调用完成之后,则销毁局部变量
    2. 全局变量:在函数体内,外都能生效的变量
  2. 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='男')

注意:

  1. 位置参数
    1. 调用函数时根据函数定义的参数位置来传递参数
    2. 传递的参数和定义的参数顺序及个数必须一直
  2. 关键字参数
    1. 函数调用的时候,可以通过 “键=值” 的形式传递参数
    2. 可以让函数更加清晰,容易使用,同时也清楚了参数的顺序需求
  3. 缺省参数
    1. 也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可以不传该默认参数的值
    2. 当调用函数时没有传递参数,就会使用默认是用缺省参数对应的值
  4. 不定长参数
    1. 也叫可变参数,用于不确定调用的时候回传多少个参数
    2. 当调用函数不确定参数个数时,可以使用

匿名函数

语法: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)

注意:

  1. 函数本身是可以作为参数,传入另一个函数中进行使用
  2. 将函数传入的作用在于:传入计算逻辑,而非传入数据
  3. 匿名函数:lambda关键字
    1. 有名称的函数可以重复使用
    2. 无名称的匿名函数,只可以临时使用一次
    3. 传入参数表示匿名函数的形式参数
    4. 函数体就是函数的执行逻辑,注意只能写一行
  4. 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}")

注意:

  1. 使用open函数,可以打开一个已存在的文件,或者创建一个新文件
    1. name:设置文件的名字,或者打开文件的本地地址
    2. mode:设置打开文件的模式(访问模式):只读,写入,追加等
      1. r:以只读方式打开文件,这个是默认模式
      2. w:打开一个文件只用于写入,如果该文件已存在则打开文件,从头开始编辑,原有内容会被除 如果该文件不存在,创建新文件
      3. a:打开一个文件用于追加,如果该文件已存在,新的内容将会被写入到已有内容之后,如果该文件不存在,创建新文件进行写入
    3. encoding:编码格式(推荐使用UTF-8)
  2. readline() 方法可以重复调用,但是 read() 方法和 readlines() 方法,不推荐重复调用或者混合使用
    1. 除非你有那个需由,输出结果是什么样子,试一下就知道了

文件的写入或追加:w 模式 或 a 模式

# 打开文件
with open("D:/day.txt", "r", encoding="utf-8") as f:

# 文件对象.write()方法:文件的写入操作 或 追加操作
	f.write("""打开文件,
	写入文件,
	追加文件
	""")

# 文件对象.flush()方法:文件的刷新操作
	f.flush()

注意:

  1. 当直接调用write,内容并不会真正写入文件,而是会积攒在程序中
  2. 调用flush的时候,内容才会真正的写入文件
  3. 这样操作是为了避免频繁的操作硬盘,导致效率下降
  4. 文件追加操作和文件写入操作完全一致,只不过是在a模式下进行

异常

语法:

try:
可能发生异常的语法
except:
如果出现异常执行的代码
else:
没有出现异常执行else的代码
finally:
无论有没有出现异常都要去执行

try:
    a = 1 / 0
except Exception as e:
    print("出现异常")
else:
    print("没有出现异常")
finally:
    print("这是个异常计算")

注意:

  1. 异常就是BUG
  2. 在可能发生异常的地方,进行捕获,当出现异常提供解决方式,而不是任由其发生导程序无法运行
  3. else 和 finally是可选的,可以写也可以不写
  4. 捕获异常的作用在于:提前假设某处会出现异常,做好提前的准备,当真的出现异常时,可以有后续手段
  5. 捕获指定异常:在 except 后面加上 异常的类型,也可以添加多个异常类型,即为捕获多个异常
  6. 如果出现的异常不是指定捕获的异常,结果还是会报错
  7. 捕获所有异常:在 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('结束')

注意:

  1. 模块
    1. 是一个python文件,以.py结尾,模块能定义函数,类和变量,模块里也能包含可执行的代码
    2. 作用:每一个模块都可以帮助我没快速实现一些功能,可以认为一个模块就是一个工具包
    3. Python的自定义模块:正常写代码即可,通过import,from关键字和导入Python内置模块一样使用
    4. 当导入多个模块的时候,且模块内有同名功能,当调用这个功能时,调用的是后导入的模块
    5. 常见组合形式
      1. import 模块名
      2. from 模块名 import 类, 变量, 方法等
      3. **from 模块名 import ***
      4. import 模块名 as 别名
      5. from 模块名 import 功能名 as 别名
    1. 从物理上看就是一个文件夹,从逻辑上看,本质依然是模块
    2. 当模块文件越来越多时,包可以帮助我们管理这些模块
    3. 导入包语法:
      1. import包名.模块名
      2. 包名.模块名.目标
    4. init.py文件的作用: 通过这个文件来表示,这个文件夹是python包,而非普通文件夹
    5. python安装第三方包的语法:
      1. 直接用外网安装: pip install 包名称
      2. 通过国内第三方网站安装: 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)}")

注意:

  1. Json的数据格式是一种轻量级的数据交互格式,采用完全独立编程语言的文本格式来存储和表示数据,本质上是一个带有特定格式的字符串
  2. 主要功能:是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传传递和交互,json可以直接和python进行无缝转换
  3. 如果数据有中文,可以添加 ensure_ascii=False 参数来确保中文正常装换
  4. json的数据格式有两种,字典或者是内部元素全是字典的列表
  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值