函数
简易购物车(v4)
# ---coding:utf-8----
# 文件名: 简易版购物车3.py
# @Time:2020/2/7 17:00
# 结算
# 商品列表
products = [{"id": 1, "name": "华为P30", "price": 3000, "quantity": 100},
{"id": 2, "name": "华为Mate30", "price": 5000, "quantity": 100},
{"id": 3, "name": "华为Mate20", "price": 2000, "quantity": 100}]
carts = []
# 展示商品
fm = "{:<6}{:<20}{:<6}{:<6}"
fm1 = "{:<6}{:<20}{:<6}{:>5}"
print(fm.format("id", "名称", "价格", "数量"))
for good in products:
print(fm1.format(good['id'], good['name'], good['price'], good['quantity']))
# 选择商品
while True:
inputId = input("请输入商品id,退出请按n:")
if inputId == 'n':
print("退出了")
break
for good in products:
if int(inputId) == good['id']:
print("你选中的是商品{}".format(good['id']))
inputQuantity = int(input("请输入欲购买商品的数量:"))
if 0 < int(inputQuantity) <= good['quantity']:
print("你购买{},数量为:{},id号为:{},".format(good["name"], inputQuantity, good['id']))
# 选择商品加入购物车
for x in carts:
if int(inputId) == x["inputId"]:
if x['inputQuantity']+inputQuantity > good['quantity']:
print("库存不足,请修改欲购商品数量")
# x['inputId'] = int(inputId)
break
else:
x['inputQuantity'] += inputQuantity
break
else:
carts.append({'inputId': int(inputId), 'inputQuantity': inputQuantity})
print("购物车有商品如下:", carts)
break
else:
print("购买数量要在1到{}之间".format(good['quantity']))
break
else:
print("你输入的商品id号{}不存在,请重新输入id号".format(inputId))
continue
# 结算
if carts !=[]:
print("您的购物车:",carts)
sum = 0
for y in carts:
for z in products:
if y['inputId'] == z["id"]:
sum += y['inputQuantity']*z["price"]
z['quantity'] -= y['inputQuantity']
print("你此次购物货款共{}元,请付款。".format(sum))
# 剩余商品
print("已付款,还有商品存货:")
print(fm.format("id", "名称", "价格", "数量"))
for good in products:
print(fm1.format(good['id'], good['name'], good['price'], good['quantity']))
函数
函数:完成特定功能的一段代码,函数可以重复调用
注意
- 编程看不到大段代码,都是一个个函数组成
- 编程最容易出错的地方是复制粘贴
- 函数里通常不打印输出,而是返回一个值
函数三要素
- 功能 (干什么的)
- 参数 (输入)
- 返回值 (输出)
命名
函数命名与变量名的规则一致,命名规则:
1.由数字、字母、_组成
2.大小写敏感
3.不能以数字开头
4.不能用关键字
5.不要和系统函数重名,函数名使用系统函数名,会覆盖原有系统函数
形参 实参
参数分类:
位置参数 形参实参1对1,顺序对应
关键字参数 形参实参以变量名进行标识传值
# 位置参数
def add(a,b):
return a+b
add(5,6) # 5,6实参必须与形参a,b数量相同,顺序一致
# 关键字参数
def add(a,b):
return a+b
add(b=1,a=3) # 使用形参的变量名a,b,个数要一致,顺序可以不一致
# 默认值参数 在函数定义的时候,给形参赋缺省值,如果传参时没有相应的实参,则使用缺省值;如果传实参,则使用实参
# 注意:只能从右向左连续赋默认值
#错误示范:
def person(name='zs',sex,age=18):
def person(name='zs',sex='male',age=18):
def person(name='zs',sex,age):
# 缺省值只计算一次,不管调用多少次函数
def demo4(a,b=[]):
b.append(a)
print(b)
demo4(1) //[1]
demo4(2) //[2]
demo4(3) //[3]
原因是定义函数时,b的地址是分配好的,当调用函数时b值指向这个b地址。除非重新定义。
# 可变参数
# 使用*来接收任意数量的位置参数
# *的不定长参数被当成元组处理
def demo(*a):
print(a)
demo(1,2,3,4,5)
# 任意关键字参数
# 使用**来接收任意数量的关键字参数
# **的不定长参数被当作字典处理
def demo(**kwargs):
print(kwargs)
demo(a=5,b=6) # 传参要使用赋值方式
demo(**{"a":5}) # 如果要传字典参数,则使用**
函数调用
- 函数调用必定有返回值,默认返回None
- 可以把函数调用当做一个值来使用
参数混合使用
# 参数的混合使用,唯一的原则是每一个形参都必须有值
# 一般规则:位置参数,任意位置参数,默认值参数,任意关键字参数
# 位置参数必须在关键字参数前
# 任意关键字参数必须在最右边
def demo6(a,b,c=8,*args,**kwargs):
print(a,b,c, args,kwargs)
# 比较常见的形式:
def demo7(a,b,*args,**kwargs):
print(a,b,args,kwargs)
demo7(3,2,5,3,4,5,f=1)
返回值
- 可以通过return语句句返回计算结果。
- 语法:return 表达式
- return的作用是终止函数的执行,return后的语句不会
被执行 - 如果没有return句句,则默认返回的是None
- return还可以返回给调用者数值
- return只返回一个值,如果要返回多个值,那么返回的是一个元组
文档字符串
函数文档字符串documentation string (docstring)是在函数开头,用来解释其接口的字符串。简而言之:帮助文档
- 包含函数的基础信息
- 包含函数的功能简介
- 包含每个形参的类型,使用等信息
文档字符串串书写规则: - 必须在函数的首行
- 使用三引号注解的多行字符串(’’’ ‘’’) 或(""" “”")
函数文档的第一行一般概述函数的主要功能,第二行空,第三行详细描述。
pycharm自动生成格式:
def demo(a,b,c,*args,**kwargs):
'''
:param a:
:param b:
:param c:
:param args:
:param kwargs:
:return:
'''
print(a,b,c,args,kwargs)
pass 代码占位符
- 在函数、if……else等逻辑分支语句也可用
参数传递(重要)
- 不可变对象:在程序运行过程中,对象不可修改的。包括:int,float,complex,bool,str,tuple
a = 3
a = 5 # 能修改吗?不,只是引用地址的变化
def a():
pass
作业(初级)
# 1.对加减乘除分别封装⼀一个函数进⾏行行计算,参数是两个数,返回值是计算结果
def add(a,b):
return a+b
def minus(a,b):
return a-b
def multiple(a,b):
return a*b
def division(a,b):
return a/b
print(add(5,6))
print(minus(5,6))
print(multiple(5,6))
print("{:.2}".format(division(5,6)))
# 2.写函数,传⼊入⼀一个参数n,返回n的阶乘
def f(n):
'''
求阶乘
:param n:n即要求阶乘的数
:return: 返回阶乘
'''
sum = 1
for i in range(1, n+1):
sum *= i
return sum
print(f(6))
for x in range(0,3):
print(x)
# 3. 传⼊入⼀一个正整数,判断这个数是否是素数,如果是返回True,否则返回False
def prime(n):
for i in range(2,n):
if n % i == 0:
return True
else:
return False
# 4. 写函数,计算并返回传入字符串中数字个数、字母个数、空格个数以及其他字符的个数。
def count(str):
alpha, number, space, other = 0, 0, 0, 0
for i in str:
if i.isalpha():
alpha += 1
elif i.isdigit():
number += 1
elif ord(i) == ord(" "):
space += 1
else:
other += 1
return (alpha,number,space,other)
a = count("abcdef")
print("共有字母{}个,数字{}个,空格{}个,其他字符{}个。".format(a[0], a[1], a[2],a[3]))
# 5.判断某个数是否是偶数,返回结果
def even(n):
if n % 2 == 0:
print("{}是偶数".format(n))
else:
print("{}是奇数".format(n))
even(5)
# 6.求1--n之间可以被7整除的数的个数,参数是n,返回个数
def divionbySeven(n):
i = 0
for x in range(1,n+1):
if x % 7 == 0:
i += 1
return i
print(divionbySeven(100))
作业(中级)
# ---coding:utf-8----
# 文件名: 作业_中级.py
# @Time:2020/2/12 18:47
# 1.写⼀个函数,传⼊⼀个字符串时间:例如5点30分29秒表示为:’5:30:29’;然后返回下⼀秒的时间(字符串)
def oneSecond(timestr):
hour = timestr.split(":")[0]
min = timestr.split(":")[1]
second = timestr.split(":")[2]
second = int(second) + 1
if int(second) == 60:
min = int(min) + 1
second = '00'
if min == 60:
hour = int(hour) + 1
min = '00'
if hour == 24:
min = '00'
hour = '00'
second = '00'
return ("{}:{}:{}".format(hour, min, second))
print(oneSecond('5:30:29'))
print(oneSecond('23:59:59'))
print(oneSecond('23:59:59'))
# 2.斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …;
# 这个数列从第三项开始,每一项都等于前两项之和。写一个函数,传入项数n,返回第n项的值
def fibonacci(n):
'''
计算斐波那契,返回第n项的斐波那契值
:param n:斐波那契数列的项
:return: 返回第n项的斐波那契值
'''
fib = [1, 1]
if n == 1 or n == 2:
return fib[1]
for i in range(3, n+1):
fib.append(fib[i-3]+fib[i-2])
return fib[n-1]
print(fibonacci(5))
# 3.传入不定个数的字符串拼接第一个和最后一个字符串
def concatString(*args):
return args[0]+args[len(args)-1] # 任意位置参数中args是一个元组
print(concatString("a","b","c","d","e","fassadfasd"))
4.自定义一个函数将传入的两个有序列表[1,5,7,9]和[2,2,6,8]合并一个有序列表,比如:[1,2,2,3,6,7,8,9]
def concatSort(list1, list2):
if type(list1) == type([1, 2, 3]) and type(list2) == type([1, 2, 3]): //判断是否列表
l3 = list1 + list2
l3.sort() //sort对原列表进行排序,print(l3.sort())会发现返回值为None
return l3
else:
return "非列表"
print(concatSort((1, 5, 3), [4, 5, 1]))
# 5.每个学生都有如下信息:学号、姓名、年龄,班级。
# 1. 请设计一个函数完成输入一个班级的学生信息,参数为班级人数,返回值为包含学生信息的列表
# 2. 请设计一个函数完成按学号查询学生信息,参数是学号,返回值为学生信息
# 3. 请设计一个函数,对学生信息按年龄排序,无参无返回值
info = []
def inputInfo(n):
print("共输入{}个学生的信息".format(n))
while True:
inputs = input("请依次输入学号、姓名、年龄、班级,用逗号隔开(例如输入:1,张三,18,一年级一班),退出请按n:").split(",")
if inputs[0] == 'n':
return info
break
else:
id = int(inputs[0])
name = inputs[1]
age = int(inputs[2])
grade = inputs[3]
for x in info:
if x["学号"] == id: # 遍历信息表,如果已经有id存在则报错并退出遍历
print("已有学号存在,请重输:")
print(info)
break
else: # 遍历信息表后,如果没有重复的才追加列表
info.append({"学号": id, "姓名": name, "年龄": age, "班级": grade})
print(info)
if len(info) >= n:
print("已完成输入{}个学生信息,退出。".format(n))
return info
def queryId(id):
for x in info: # info是全局变量,初始值为[],inputInfo(n)可以增加学生信息。一旦重新运行就会被污染,怎样保留?
if x["学号"] == id:
return x
else:
print("查无此人")
def sortByAge():
for y in range(0,len(info)-1): # 要进行列表长度-1轮交换位置
for x in range(1, len(info)-y): # 左右对比,左边比右边大就调换位置,完成1个元素的调整
if info[x-1]['年龄'] > info[x]['年龄']:
temp = info[x]
info[x] = info[x-1]
info[x-1] = temp
else:
return info
print(inputInfo(3)) # 录入3个学生数据
print(queryId(2)) # 查询学生学号
print(sortByAge()) # 按年龄由小到大排序