#A 来吃饭 ..
print("将食材西红柿干净切碎...")
print("西红柿和鸡蛋放到一起...")
print("放入调料,大火猛炒,然后装盘出锅...")
#B来吃饭 ...
print("将食材西红柿干净切碎...")
print("西红柿和鸡蛋放到一起...")
print("放入调料,大火猛炒,然后装盘出锅...")
#创建一个方法就可以,不用每次都这么搞,可以减少代码的冗余如何解决问题?
len(), sum() , max()
等等。# 使用食材,鸡蛋做饭的方法
def eat():
print("将食材西红柿干净切碎...")
print("西红柿和鸡蛋放到一起...")
print("放入调料,大火猛炒,然后装盘出锅...")
# 奥特曼来吃
eat()
print("-" * 40) # 华丽的分割线
# 小怪兽来吃饭
eat()
函数的定义其中的方法名,需要 遵循标识符的定义规则 .
如何 定义一个函数:
def
关键字 开头,后接 函数标识符名称 和 圆括号()。方法一定先定义,然后 再调用。
def 函数名(参数1, 参数2...):
'''
函数方法说明,文档。
'''
# 具体处理问题的逻辑
函数体: 写逻辑地方,如 if while print()等代码集.
return 具体的返回值
def
表示这个是在定义函数.return
结束函数的,并且返回结果(也 可以是一个表达式)函数使用的 细节:
形式参数 和 实际参数
现在问题来了, 我上面 “炒鸡蛋的方法完善一下”
'''
1. 带参数的方法
鸡蛋的多种吃法 ,现在我不想使用西红柿了, 我想换成黄瓜?
怎么做?
'''
#def eat(a): # 为什么不建议写a?
def eat(food): #使用参数
'''
我是该方法说明:
:param food: 食物
:return: none
'''
print(f"将食材{food}干净切碎...")
print(f"{food}和鸡蛋放到一起...")
print("放入调料,大火猛炒,然后装盘出锅...")
eat(10) #可以么?
eat(True)#可以么?
print("*"*40) #华丽的分割线... ...
eat("黄瓜") #可以么?
# 1.定义函数, 要求计算两个正整数的和,并打印在控制台上
def getAdd(num_1, num_2): #形式参数
# def getAdd(): # 这么写为什么,下面参数为什么会报错 ?
'''
定义函数 对两个正整数求和.
:param num_1: 第一个整数
:param num_2: 第二个整数
:return: 无返回值 none
'''
# 也可以返回一个结果
# num = num_1+num_2
print(num_1 + num_2) #也可以返回一个表达式
# 2.函数的调用,传递的实际参数
getAdd(100, 200)
getAdd(15, 20)
print(getAdd(17,18)) #none 没有返回值就打印 none
为什么要有返回值?
return
返回结果'''
1. 就是需要将执行结果做一些事情,
例如, 三个数,求平局值
'''
def getAdd(num_1, num_2, num_3):
'''
求三个数的和
:param num_1: 第一个数
:param num_2: 第二个数
:param num_3: 第三个数
:return: num 三个数的和
'''
num = num_1 + num_2 + num_3
return num
# 赋值调用
num = getAdd(10,20,30)
print(num)
#求平均值
# getAdd(10, 20, 30) #为什么没输出 ? 20 需要打印输出或者变量接收.
avg = num / 3
print(int(avg)) # 20
赋值调用 和 输出调用。
#第一种调用方式
num = getAdd(10,20,30) # 赋值调用
print(num)
#第二种调用方式
print(getAdd(10,20,30)) #输出调用
通过上面两个案例之后, 什么叫做无参数,无返回值?
'''
无参数,没有返回值
'''
def menu():
num = int(input("请输入你选择的数字: "))
if num ==1:
print("火锅")
elif num ==2:
print("烤肉")
elif num ==3:
print("炒菜")
else:
print("您输入有误,请重新输入")
# 调用点菜方法
menu()
def get_info():
# 通过控制台输入,模拟获取问题采集问题
info = input("请输入温度: ")
return info
#1.调用方法,赋值输出
value = get_info()
print(value)#输出结果
#2.打印输出
#print(get_info())
在Python中,程序的 变量并不是在哪个位置都可以访问 的,访问权限决定于这个变量在哪里赋值的。
a = "学校广播" #全校班级都能听见
def test():
a = "班级广播" #只有自己班能听见,隔壁班听不见
# a = "班级广播" #如果函数里没有,就去外面找.
print(a)
test() #谁听的最清楚? 班级广播
定义位置不同
定义格式不同
global
变量名作用域不同
.py文件中
'''
三个区别:
位置
范围
格式
'''
def function_1():
num = 100
print(num)
def function_2():
num = 200
print(num)
#调用方法,中的num 相互不影响
function_1()
function_2()
#输出num, 没有定义num
print(num)# 为什么会报错?
全局变量的范围.
'''
全局变量关键字
global 使用
'''
num = "全局变量"
def function_1():
print(num)
def function_2():
print(num)
#1.调用方法
function_1()
function_2()
关键子 global
使用。
global num = 200
注意,不支持这样声明,必须拆分写'''
全局变量关键字
global 使用
'''
num = "全局变量"
def fuction_1():
print(num)
def function_2():
# 2. 在function中修改外局部变量
# num = 300 #只是修改了局部变量
global num
num = "修改成功了么"
print(num)
# 1.调用方法
#function_2() 如何先执行 2会有什么结果
fuction_1()
function_2()
print("*"*30)
#在调用fuction时, 为什么会改变了?
fuction_1()
许多编程语言中,函数通常只能返回单个值。
'''
return 返回多个值.
案例,通过模拟计算器。
'''
def calculator(a, b):
'''
method 计算器方法
:param a: 参数 a
:param b: 参数 b
:return: 加 减 乘 除
'''
addition = a + b
subtraction = a - b
multiplication = a * b
division = a // b # 向下取整
#一个相当牛b的写法, 只有python中有.
return addition, subtraction, multiplication, division
#2. 调用方法
resault=calculator(10,5)
print(resault) # 相当于返回一个元组. (15, 5, 50, 2)
#2.1 返回单个结果
print(f"加法: {resault[0]}, 减法: {resault[1]},乘法: {resault[2]},除法: {resault[3]}")
相当于在 一个函数中调用另一个函数。
'''
函数又叫做方法,
函数的嵌套使用就相当于在方法中调用另一个方法.
'''
# 定义方法
def function_1():
print("function_1 start...")
print("只因你太美... ")
print("唱 ,跳 ,rap,篮球 ")
print("function_1 end...")
def function_2():
print("function_2 start...")
# TODO 正常逻辑代码
function_1() #在方法2中调用方法 1
print("function_2 end...")
#2.调用方法
#function_1()
function_2() # 在方法中调用方法1
通过案例: 计算阶乘 n!=1*2*3*4*....n
的例子来 演示递归函数 的使用。
'''
什么是递归函数?
就是在方法中自己调用自己.
案例: 计算阶乘的一个函数
n!=1*2*3*4...n
'''
def func(num):
'''
计算阶乘
:param num: 计算阶乘
:return:
'''
#相当于出口条件,结束递归.
if num == 1:
return 1
else:
return num * func(num - 1)
# 调用方法
number = func(3) # 3! = 1*2*3
print(number)
注意:在使用递归时,必须设置一个出口条件,也称为递归基例(base case),
func(3)
/ \
3 * func(2)
/ \
2 * func(1)
/ \
1 return 1
'''
1. 函数传参问题:
1.1 按照函数形式参数的位置, 将实际参数的值传递给形式参数。
'''
# 2. 创建方法
def show(name, age, address):
'''
显示个人信息
:param name: 名字
:param age: 年龄
:param address: 地址
:return: none
'''
print(f"名字: {name}, 年龄:{age},地址: {address}")
# 3.调用方法 形式参数位置,与传递实际参数位置保持一致
show("刘亦菲", 34, "北京")
# 3.1 假如位置,不一致,虽然不报错,但是需要!!避免
show(34, "刘亦菲", "北京")
# 3.2 少参数
# show("刘亦菲",34) # show() missing 1 required positional argument: 'address'
# 1. 创建方法
def show(name, age, address):
'''
显示个人信息
:param name: 名字
:param age: 年龄
:param address: 地址
:return: none
'''
print(f"名字: {name}, 年龄:{age},地址: {address}")
# 1, 使用形式参数的关键字同名进行传递参数。
show(age=34,name="刘亦菲",address="北京南城")
#3.混合使用
#3.1 位置放到后面
show("刘亦菲",address="北京2",age=18)
#3.2 这样就会报错
#show(age=18,"刘亦菲",address="北京")
'''
1.默认参数
'''
# 在祖国境内都属于中国人
def showInfo(name, country="中国"):
print(f"我的名字是: {name},现在,所在地{country}")
# 1.1使用默认参数
showInfo("后裔")
# 1.2 传递参数 改变 country
showInfo("夸父", "宇宙")
#2. 如果不在最后一位会报错,默认参数
def showInfo(name, country="中国",sex):
print(f"我的名字是: {name},现在,所在地{country}")
通常定义一个函数时, 若希望函数能够 处理的参数个数比当初定义的参数个数多, 此时可以在函数中使用不定长参数。
定义语法格式
form_args
为形参(如,a,b之前所用参数)*args
和 **kwrgs
为不定长参数。form_args
) ,如果超过匹配行参个数就会有如下两种情况:
*args
会以 元组 的形式存放这些多余的参数。**kwargs
会以字典的形式 存放这些被命名的参数, {m:1}
#语法格式如下
def func([formal_args,] *args,**kwargs ):
'''方法说明_文档'''
函数体
return 表达式
不定长参数的 简单使用
*agrs
,表示不定长元组, 接受所有 位置参数**kwargs
,表示不定长字典,接受所以 关键字参数
#创建一个方法,带有不定长参数
# def func(a,b): #方法只定义两个普通参数。
def func(a,b,*args):
print(a)
print(b)
print(args)
#print(type(args))
# 调用方法1,传递参数
func(10,20) #10 20 ()
#调用方法2,传递多少都没有关系
func(11,12,13,14,15,16)
print("-"*50) #华丽的分割线
#2. 不定长参数 **kwargs 需要传递的是关键字参数
def func2(a,b,*args,**kwargs):
print(a)
print(b)
print(args)
print(kwargs)
# print(type(kwargs))
#2.调用函数
func2(4,2,3,4,name="你好")
10
20
()
11
12
(13, 14, 15, 16)
--------------------------------------------------
4
2
(3, 4)
{'name': '你好'}
不定长参数,运用的方式
'''
主要定义格式使用:
def func_1(a,b):
def func_1(a,b,*args): 或者 def func_1(*args):
'''
# 1.不定长参数
def func_1(a, b):
print(a)
print(b)
# 1.1 调用函数,传递多余位置参数
# func_1(10,20,30)#当多余一个元素时肯定会报错.
print("-" * 40) # 华丽分割线
# 1.2两种形式解决问题:
# 1.2.1 使用 不定长参数 *args语法
def func_2(a, b, *args):
print(a)
print(b)
print(args)
# 调用函数
func_2(10, 20, 30, 40, 50)
print("-" * 40)
# 1.2.2 直接定义 不定长参数
def func_3(*args):
print(args)
# 使用*args不定长函数的使用方式
func_3(10, 20, 30, 40)
函数的参数, 说明情况。
# 演示带所有函数的参数
#a 普通参数 b 是默认参数, *args不定长参数(元组) ,**kwargs 不定长参数(字典)
def func(a, b=10, *args, **kwagrs):
pass #空语句
# 8是位置参数, b=8 是关键字参数
#注意: 是位置在前,关键字在后.func(b=89,19)这样不可以
func(8,b=8)
使用函数求和的另一种方式,如果不确定传递参数个数, 就使用不定长参数。
func(int...num)
#版本1: 功能相似 参数列表不同
# 功能相似,但是参数列表不同,在java中叫做可变参数(int ...a)
def func_1(a, b):
return a + b
def func_2(a, b, c):
return a + b + c
print("-"*40) #华丽的分割线
#版本2:使用不定长参数解决多个数求和问题
# 在实际开发中程序的设计,并不能一开始就确定参数个数是多少.
#定义方法
def add(*args):
'''
使用不定长参数求和
:param args: 多个参数
:return: 求和
'''
sum = 0 #累计求和
for i in args: # *args是一个参数元组
sum+=i
# print(sum)
#将参数的方法返回
return sum
#调用方法
print(add(10,20,30))
print(add(10,20,30,40,50))
print(add())
'''
拆包使用 : 容器类型
1. 元组
2. 列表
3. 字典
'''
#将容器类型(list,tuple,dict)拆分成多个变量
tuple_1 =(10,20,30)
#1.1 进行拆分
# a,b,c,d = tuple_1 #数量要一致
a,b,c = tuple_1
print(a)
print(b)
print(c)
print("-"*40)
#2.拆分列表
list_1 = ["王一博","吴琼","杨洋"]
l1,l2,l3=list_1 #2.1 注意参数和列表个数一定要对。
print(l1,l2,l3)
#3. 拆分字典,拆包之后获取的: 键
dict_1 = {"name":'王一博',"age":24}
#注意拆包之后获取的是键
#key value = dict_1 # 打印的也是键值
key1,key2 =dict_1
print(key1,key2)#可以通过key获取对应value的值
print(f"{key1}:{dict_1[key1]} 和 {key2}:{dict_1[key2]}")
#遍历,字典的两种方式
dict_1 = {"name":'王一博',"age":24}
for item in dict_1.items():
print(item[0],item[1])
#第二种拆包的体现:
for key,value in dict_1.item(): #其中的 key ,value就是拆包的体现
print(key,value)
在Python中,组包(packing)是一种将多个变量打包到一个容器对象中的过程、正好与拆包相反。
'''
将多个元素,存放到容器中
'''
#1.组包 元组
tuple_1 =10,20,30 #如果不写()默认为元组
print(type(tuple_1))# 类型
print(tuple_1)
#2. 组包 列表
list_1 =[10,20,30]
print(type(list_1))
print(list_1)
在Python中,引用(reference)是指一个变量指向(引用)一个对象的内存地址。 当我们将一个对象赋值给一个变量时,实际上是将该对象的引用赋给了该变量。
id()
可以查看 引用地址。 a = 10
引用的概念在Python中非常重要,因为它涉及到变量的使用、内存管理和对象之间的关系。
a = 20
python中一切的 传递都是引用(地址),无论是赋值还是函数调用。
'''
1.引用:
指一个变量指向一个对象地址值。
'''
# 把10的内存地址值赋值(引用id()可以查看)给变量a
a = 10
# 把20的内存地址值(引用)赋值给 变量b
b = 20
# 把a的引用赋值给变量b
b = a
# 得出的结论 a的地址值,应该和 b一样。
print(a, id(a))
print(b, id(b))
print("-" * 40) # 分割线
# 2. 将20的引用赋值给 a变量.
a = 20
print(a, id(a)) # 20 140719029278976
a = 20 ,这里并非真正修改了对象的值,而是改变了变量 a 的引用,使其指向新的整数对象 20 。
类型可变和不可变类型、是有划分依据的:
id()
具体分类:
list 列表、dict字典。
int、float、bool、str、tuple、set。
不可变类型
'''
1. 演示不可变类型
修改变量内容,地址值也会发生改变.
'''
# id()查询地址值,内存。
# string 类型不可变类型
str_1 = "123"
print(str_1, id(str_1))
str_1 = "124" # 修改值
print(str_1, id(str_1)) # 内存中地址值也发生了改变。
print("-" * 40) # 华丽的分割线
#int类型不可变类型
int_1 = 123
print(int_1,id(int_1))
int_1 =124
print(int_1,id(int_1))
123 1834380549680
124 1834380549552
----------------------------------------
123 140732445681120
124 140732445681152
可变类型
'''
2. 不可变类型
修改内容之后,地址值没有发生改变。
'''
# 容器类型
list_1 = [11, 12]
print(list_1, id(list_1))#[11, 12] 3037210209216
# 添加数据
list_1.append(13)
print(list_1,id(list_1))#[11, 12, 13] 3037210209216
#注意: 相当于从新创建了一个新的列表,所以发生了改变
list_1 =[22,44]
print(list_1,id(list_1))#[22, 44] 3037210448000
在Python中,列表(List)是动态数组,可以自动扩容 以适应存储更多的元素。当列表的元素数量达到当前容量时,系统会自动增加内部的存储空间,以容纳更多的元素。
时间戳、表示的是从1970年1月1日00:00:00 开始按秒计算的偏移量。
time()
'''
时间函数
是一个时间戳从1970年1月1日开始 00:00:00 开始按秒计算
'''
#导入time模块
import time
begin = time.time()
print(begin)#1689254319.0681674
上述的格式不利于阅读、需要格式化的时间字符串。
strftime
函数可以返回一个格式化的日期与时间。#format 参数表示格式化字符串 t 是可选参数,它是一个时间元组
time.strftime(format[ 、t])
'''
# 通过time模块的strftime 函数可以返回一个格式化的日期与时间
import time
a = time.localtime() # 返回一个元组
print(a)
print("-" * 40) # 华丽的分割线
# 使用"%Y-%m-%d %H:%M:%S"形式 格式化 a
print(time.strftime("%Y-%m-%d %H:%M:%S", a))
time.sleep(秒)
,休眠
import time
i =1
while i<100:
print(i)
time.sleep(1) #时间休眠 1秒
i+=1
random模块用于生成随机数、它提供了很多函数。
random.rangdom()
返回0~1之间的随机浮点数N、 范围0<=N<1.0import random
#生成第一个随机数
a = random.random()
#生成第二个随机数
a_1 =random.random()
#随机生成100个
for i in range(100):
num = random.random()#随机数
print(num)
random.randint(a,b)
返回一个随机的整数N 、 其中a,b是整数。 N的取值范围为 a<=N<=bimport random
a=random.randint(1,3)#随机生成 1~3的整数
print(a)
random.choice(参数)
、其中参数可以是列表、字符串。#随机返回一个元素
a_1 =random.choice("好好学习,天天向上")
a_2 =random.choice(["好好","学习","天天","向上"])
print(a_1)
print(a_2)
random.shuffle()
洗牌,打乱列表#无返回值方法, 排序完生成
list_1 = ["hello", "my", "son"]
#静态方法直接使用,相当于java中的Collections
random.shuffle(list_1)#无返回值方法
print(list_1)#['son', 'my', 'hello']