Day11-12:函数基础

简易购物车(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. 函数里通常不打印输出,而是返回一个值

函数三要素

  1. 功能 (干什么的)
  2. 参数 (输入)
  3. 返回值 (输出)

命名

函数命名与变量名的规则一致,命名规则:
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())     # 按年龄由小到大排序



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值