python基础之函数详解(一)

1.函数参数

1.1参数分类

  • 必须参数
  • 默认参数
  • 关键字参数
  • 可变参数
# 1.必需参数
# 注意1:形参和实参的数量,类型,顺序的匹配
def add(n1,n2):
    print("%d + %s = %d" % (n1,n2,n1 + n2))
add(2,3)
# add(2)        数量
# add(3,"ab")   类型
# add("afs",10)  顺序

# 2.默认参数
# 注意1:默认参数体现在形参部分
#[形参可以理解为等待传参的变量]
def test(name="aaa",age=0):
    print("姓名:%s,年龄:%d" % (name,age))
# 注意2:默认参数的作用就是为了简化函数的调用,最多体现在系统函数的使用中,print(sep,end)
test("zhangsan",10)
test()
test("hello")
#注意下面的写法调用
def test1(name,age=0):
    print("姓名:%s,年龄:%d" % (name,age))
test1("zzz")
test1("hhh",20)

# 注意3:在形参列表中,默认参数个数不限制,可以全部都是默认参数,也可以部分是默认参数,
# 但是,如果部分是默认参数,则默认参数需要出现在形参列表的最后【例如下面的test2(name,age=0,score=100)】
# def test2(name='aaa',age):  #SyntaxError: non-default argument follows default argument
#     print("姓名:%s,年龄:%d" % (name,age))
# test2(10)
def test2(name,age=0,score=100):
    print("姓名:%s,年龄:%d" % (name,age))

# print(int("110"))
# print(int("110",2))


# 3.关键字参数
# 注意1:关键字参数体现在实参部分
def test(name,age):
    print("姓名:%s,年龄:%d" % (name,age))
test("hahha",10)
# 注意2:变量名 = 值,此处的变量名不能随意定义,一定要和形参列表中的变量名完全一致
# 注意3:关键字参数的好处:可以不按照形参的顺序进行传参
test(age=10,name="hahhha")
test(name="hahhha",age=10)
# test(name1="hahhha",age=10)  # TypeError: test() got an unexpected keyword argument 'name1'

def test(name='aaa',age=0):
    print("姓名:%s,年龄:%d" % (name,age))
test()
test('www')
test('qqq',7)
test(age=8)
test(name='ttt')
test(name="uuu",age=38)
test('ggg',age=19)
# 注意4:在实参列表中,实参可以全部是关键字参数,也可以部分是关键字参数,
# 但是,如果部分是关键字参数,则关键字参数必须出现在实参列表的最后
# test(name='jjj',24)  # SyntaxError: positional argument follows keyword argument
#默认参数:形参,关键字参数:实参
# 4.不定长参数/可变参数
# 注意:调用函数的时候,遇到不定长参数,可以传参,也可以不传参,也可以传多个
# 4.1  *:元组
# 注意1:当形参列表中出现   *变量名  ,则该变量表示元组(那么下面的都讲num当作元组来处理就行)
def test(num):
    print(num)
test(10)#num类型就是保存的10的地址
def test(*num):
    print(num)
test(10)
test(4,65,6,56,5,5,7,5,7)#这里可以叫打包,讲一堆零散的数据给他全部放到一个容器里面了
test()

# 注意2:不定长参数可以和必需参数或者默认参数结合使用
def test(num1,num2,num3=10,*num4):#这里传参最起码要三个,给前三个传第就行
    print(num1,num2,num3,num4)
test(5,6,6)
test(6,7,8,45,6,5,76,7,6,8)#6 7 8(45,6,5,76,7,6,8)

# 注意3:在形参列表中,同种不定长参数只能出现一个
# def test(num1,num2,*num3,*num4):
#     print(num1,num2,num3,num4)
# test(6,7,8,45,6,5,76,7,6,8)#问题:6 7给了前两个,其余的给了第三个,与第四个冲突了到底该咋放,所以出问题了

# 【problem】阅读下面这段代码,输出结果
# 注意4:在形参列表中,不定长参数最好出现在最后(最好)
# 如果出现在形参列表的中间位置,则可以在实参列表中借助于关键字参数解除歧义
def test(num1,num2,*num3,num4):
    print(num1,num2,num3,num4)
#test(6,7,8,45,6,5,76,7,6)#num4没有值付给它,所以报错
test(6,7,8,45,6,5,76,7,6,num4=8)

# 结果 6 7 (8,45,6,5,76,7,6)
# 4.2  **:字典
def test(**num):
    print(num)
test()
# 注意1:**表示字典,所以实参需要通过键值对的方式传参
# test("fad",5,6,5,75)#报错,因为不是键值对
# 注意2:key=value,此处的key必须是一个标识符,在生成的字典中会被识别为字符串
test(name='fdf',age=18,score=100,a="aaa")#这种情况下字典中只能是字符串

# argument:参数 keywordargument:关键字参数
# 注意3:一般情况下,如果*和**结合使用,则建议形式为:*args,**kwargs
def test(num1,*num2,**num3):
    print(num1,num2,num3)
test(10,20,30)
test(10,20,30,x=40)#此处x是变长参数,能任意写值,若是关键字参数的话就不能任意写值了

1.2参数的传递


"""
【problem],简述值传递和引用传递的区别
值传递:实参是不可变的数据类型,当形参发生改变,对实参没有影响
[相当于数据拷贝了一份,我现在不指向此数,指向了其他的数,但是
原来的数不变]
引用传递:实参的是可变的数据类型,当形参的内容发生改变,实参会
随着发生改变【就是看地址一样不,地址要是不一样,那传进去之后
不影响原来的,若是传进去地址一样,那么就会跟着修改的】
"""

# 1.不可变
def text(num):
    print("地址:",id(num))
    print("传递进来的num=:%d" % (num))
    num = 100
    print("修改之后的num=:%d" % (num))#这保存的是100的数据
    print("地址:", id(num))

temp = 23
text(temp)   # num = temp  --->num = 23
print("函数调用完成之后temp=%d" % (temp))
#传进来的num = 23
#修改之后的num=100
#地址:140723236364416
#函数调用完之后temp = 23


# 2,可变
def text(numlist):
    print("地址:", id(numlist))
    print("传递进来的num=:%s" % (numlist))
    numlist[1] = 100
    print("修改之后的num=:%s" % (numlist))#这的地址和上面的地址一样,篮子还是之前的篮子就只是给那里面的数据换了一下,这会出现问题:上一行代码修改了数据之后,因为下面调用时候temp保存的地址是和他同一个地址,所以会影响
    print("地址:", id(numlist))

temp = [11,22,33]
print("temp的地址:",id(temp))
text(temp)   # num = temp--->num = []
print("函数调用完成之后temp=%s" % (temp))

#temp的地址:2637259297480
#地址:     2637259297480
#传进来的num =:[11,22,33]
#修改之后的num = :[11,100,33]
#函数调用完成之后temp = [11,100,33]

2.打包和拆包

# pack:打包
# unpack:拆包

# a.定义多个变量
# 注意:=两边的变量和数据的数量必须保持一致
num1,num2 = 10,20
print(num1,num2)
num1,num1 = 23,4
print(num1)

# b.
num1 = 39
num2 = 10
num1,num2 = num2,num1
print(num1,num2)

# c.
# 在变量的前面添加*,则表示打包【封包】,得到的结果为列表,和函数形参列表中的*区别,函数形参的最后放这个,而且是元组
num1,num2,num3 = 4,5,6#左边,右边的数量要一致
print(num1,num2,num3)

num1,num2,*num3 = 4,5,6,6,7,8,10
print(num1,num2,num3)#
num1,*num2,num3 = 4,5,6,6,7,8,10
print(num1,num2,num3)
*num1,num2,num3 = 4,5,6,6,7,8,10
print(num1,num2,num3)

# 注意:在进行打包的时候,*只能出现一次
# num1,*num2,*num3 = 4,5,6,6,7,8,10
# print(num1,num2,num3)

# d.拆包(元组列表集合都可以进行拆包)
num1,num2 = (45,7)
print(num1,num2)
num1,num2 = [45,7]
print(num1,num2)
num1,num2 = {45,7}
print(num1,num2)

# 注意:=两边的变量和可迭代对象中元素的数量必须保持一致
# num1,num2 = (45,7,56,0)
# print(num1,num2)

3.函数返回值

  • return关键字的使用

  • 封装【设计】一个函数,考虑两点:

    1)是否设置参数,根据需求中是否有未知项参与运算

    2)是否设置返回值,根据需求运算完是否有结果

"""
返回值:函数运算完成之后的结果,本质是return的使用
注意:
    a.返回值可以选择性的省略
    b.谁调用,返回给谁;在哪里调用,返回到哪里
    c.如果函数由返回值,则函数调用完毕之后,可以使用变量获取
    结果
语法:变量 = 函数(实参列表)
"""
# 1.没有返回值
# 注意:如果函数没有返回值,则默认返回None
def func1():
    print("11111")
r1 = func1()#没有rutern的话,返回的是None所以:r1 = None
print(r1)

# def func1():
#     print("11111")
#     return None
# r1 = func1()
# print(r1)

# 2.没有返回值但是使用了return
# 注意:在函数体中出现了return,但是没有返回值,
# 此时return可以单独作为一条语句,表示结束函数,后面的语句【和return平级的】没有执行的机会

# 在平级的情况下,一般在return的后面不会书写更多的代码
def func2():
    print("2222")
    return   #表示结束函数,下面的语句就没有机会执行,所以编辑器会报警告
    # print("over")
r2 = func2()
print(r2)#默认None

def func2():
    print("2222")
    n = 0
    if n < 10:
        return    #缩进之后,下面的print("over")有执行的机会,所以,代码不会报警
    print("over")
func2()

print("*" * 30)

# 3.有返回值,但是只有一个
# 注意:return  xxx的作用有两个:一是结束函数,二是将函数的运算结果返回
def func3():
    print("3333")
    num = 100
    # 返回值存在的意义:如果函数运算的结果在函数的外面需要使用,则通过返回值返回
    # 因为函数内部的定义的变量只在函数内部有被访问的权限
    return  num
r3 = func3()
print(r3)

# 练习:求两个数的和并将结果返回
def add(x,y):
    # 局部变量
    total = x + y
    return total

r31 = add(4,6)
print(r31)
# 全局变量
# 注意:因为局部变量和全局变量的被访问的权限不同,所以二者可以重名
total = 100
print(total)

# 4.有返回值,而且返回多个
# 多个被返回的数据被进行了打包的处理,结果为一个元组
def func4(a,b,c,d):
    return a,b,c,d
r4 = func4(6,3,2,6)
print(r4)

# 5.一个函数中可以出现多个return,一般结合if语句
# 注意:在同一个函数中,如果有if分支,不同的分支可以返回不同的数据类型,不同的分支可以选择返回值的有无
def func5(num):
    if num > 0:
        return "正数"
    elif num < 0:
        return "负数"
    else:
        # return 0
        print(0)

r5 = func5(0)
print(r5)
#建议:要是有返回值就都写返回值,要是没有返回值的话就都没有返回值(自己添加)
# 6.return和break之间的区别
"""
break:结束当前循环
return:结束函数
"""
def func6():
    while True:
        data = input("请输入:")
        if data == "q":
            # break#这个也可以因为后面没有代码了,当循环在函数内部时候可以用return代替break
            return
func6()

# a
def func61():
    for i in range(3):
        for j in range(5):
            print("%d=%d" % (i,j))
            if j == 2:
                break
    print("Over~~~~~61")
func61()

def func62():
    for i in range(3):
        for j in range(5):
            print("%d=%d" % (i,j))
            if j == 2:
                return
    print("Over~~~~~62")
func62()#[为了告诉你:在某些情况中可以用return代替break]

4.空函数和主函数

# import  textdemo
from textdemo import  *

# 1.空函数
def test():
    pass

# 2.主函数:整个程序执行的入口
# def check():
#     print("check")

check()

def check():
    print("check")

print(__name__)

"""
a 一个py文件实际上就是一个模块
b 每个模块都自带了一个__name__属性,当运行的是当前文件,则__name__的值(默认)为__main__
  如果运行的是其他文件,当前文件被其他文件导入使用了,则__name__的值为文件名
c 当一个py文件被当做模块使用时,可以将测试的代码书写到if语句中,当其他文件导入该文件时,该部分代码会被屏蔽
"""
if __name__ == "__main__":
    print("text测试文件")
    check()
  

5.匿名函数

  • 概念:不再使用def这种标准形式定义函数,而是使用lambda表达式来创建函数,该函数没有函数名,被称为匿名函数

  • 语法:lambda 形参列表:函数体 返回值

  • 说明:

    a)lambda只是一个表达式,用一行代码实现一个简单的逻辑,可以达到对函数的简化【优点】

    b)lambda主体是一个表达式,而不是一个代码块,只能封装有限的逻辑【缺点】

    c)lambda拥有自己的命名空间,不能访问自有列表之外或者全局命名空间里的参数

"""
【problem】什么是匿名函数,优缺点
    是一个lambda表达式,本质上还是一个函数,可以设置参数,也可以进行调用,
    表达式本身就是函数的运算结果
    
    优点:
        简化代码
        减少内存空间的使用
    缺点:
        只能实现简单的逻辑,逻辑一旦复杂,代码的可读性会降低,则不建议使用
"""

# 定义语法:变量名  = lambda 形参列表:函数体  返回值
# 调用语法:变量名(实参列表)

# 1.基本用法
def func1():
    print("111")
print(func1())

f1 = lambda :print("111")
print(f1())

# 2.需求:求两个数的和
def add(x,y):
    return x + y
print(add(3,5))
# 注意:匿名函数中的返回值直接书写,不需要借助于return
a1 = lambda x,y:x + y
print(a1(4,8))

# 3.默认参数和关键字参数,不定长参数
# 注意:匿名函数本质还是一个函数,所以除了函数声明部分和函数体做了简化 ,其他用法和普通函数完全相同
r3 =lambda a,b,c:a ** 2 + b ** 2 + c ** 2
print(r3(1,2,3))

r3 =lambda a,b=0,c=0:a ** 2 + b ** 2 + c ** 2
print(r3(1,2))#默认参数也可以从外面传参进行替换
print(r3(1))
print(r3(c=3,b=5,a=2))#关键字参数

r3 =lambda *a:a[0]#a是元组,返回的是元组的第0个元素,参数**a也可以用
print(r3(43,6,6,45,75))

# 4.匿名函数的函数体部分可以使用if语句
r4 = lambda m,n:m if m >= n else n#三元运算符(注释是自己添加)
print(r4(6,80))

# 5.应用:sort
"""
sort自定义排序的工作原理:将列表中的每个元素依次作用于指定的函数,然后用该函数的返回值进行比较然后排序
# 注意:函数的返回值必须支持>   <  运算
"""
list1 = ['534','gsgrsgsh','shhsh','2']
list1.sort(reverse=True,key=len)

# 练习:将列表按学生成绩从大到小排序
students = [
{'name': '小花', 'age': 19, 'score': 90, 'gender': '女', 'tel':
'15300022839'},
{'name': '明明', 'age': 20, 'score': 40, 'gender': '男', 'tel':
'15300022838'},
{'name': '华仔', 'age': 18, 'score': 90, 'gender': '女', 'tel':
'15300022839'},
{'name': '静静', 'age': 16, 'score': 90, 'gender': '不明', 'tel':
'15300022428'},
{'name': 'Tom', 'age': 17, 'score': 59, 'gender': '不明', 'tel':
'15300022839'},
{'name': 'Bob', 'age': 18, 'score': 90, 'gender': '男', 'tel':
'15300022839'}
]

# 法一
# for i in range(len(students) - 1):
#     for j in range(len(students) - 1 - i):
#         if students[j]['score'] < students[j + 1]['score']:
#             students[j], students[j + 1] =  students[j + 1],students[j]

#法二
# 自定义排序规则:成绩
# def标准形式的函数
def rule(x):
    return x['score']
students.sort(reverse=True,key=rule)
print(students)

# 法三
# 匿名函数
students.sort(reverse=True,key=lambda x:x["score"])


# 【problem】阅读下面的代码,写出执行结果[有点难度]
def func():
    a = []
    for i in range(5):
        a.append(lambda x:i * x)#加的是函数方面考虑,循环一次,加一次函数,然后给他添加到列表中,列表里面添加的不是函数的本身,而是函数的地址,这个是函数的定义,只有在下面传实参的时候才会调用匿名函数
    return a
result = func() # result = a
print(result)#
print(result[0])#将函数取出来相当于是函数的名
print(result[0](2))#将函数取出来之后再调用匿名函数(又因为此时调用时候,上面的含数都已经调用走完了,循环的之后的最后i是4,所以下面所有的调用i==4,所以结果都为8)
print(result[1](2))
print(result[2](2))
print(result[3](2))
print(result[4](2))
"""
>>> def func():
...     a = []
...     for i in range(5):
...         a.append(lambda x: i * x)
...     return a
...
>>> result = func()
>>> print(result)
[<function func.<locals>.<lambda> at 0x0136F4F8>, <function func.<locals>.<lambda> at 0x0136F540>, <function func.<locals>.<lambda> at 0x0136F588>, <function func.<locals>.<lambda> at 0x0136F5D0>, <function func.<locals>.<lambda> at 0x0136F618>]
>>> print(result[0])
<function func.<locals>.<lambda> at 0x0136F4F8>
>>> print(result[0](2))
8
>>> print(result[1](2))
8
>>> print(result[2](2))
8
>>> print(result[3](2))
8
>>> print(result[4](2))
8
"""

6.高阶函数
一个函数可以接受另一个函数作为参数,同样,还可以把一个函数作为另一个函数的返回值,这种函数的使用方式称为高阶函数

1.map()#[相当于列表推导式,通过一个容器生成另一个容器]


"""
map(fn,seq),映射
    fn:函数,可以是def定义的标准函数,也可以是匿名函数
    seq:序列,
功能:将函数fn依次作用于序列seq中的每一个元素,根据函数的返回值生成一个新的序列
"""
# 1.需求:[1,4,9,16,25]
# 法一:列表推导式
list1 = [i ** 2 for i in range(1,6)]

# 法二:map和def
def test(x):
    return x ** 2
r1 = map(test,range(1,6))#[map是一种单独的数据类型,返回的值存储在同一个地址中][通过一个已知的容器,根据你给的规则,给他转化成(生成)一个新的序列,这个序列的规律就是def返回值的那块的表达式了]
print(list(r1))#将地址转化为熟悉的数据类型列表就可以看到里面的数据了

# 法三:map和lambda
r2 = map(lambda x:x ** 2,range(1,6))

# 2.需求:[1,2,3,4]---->['1','2','3','4']
numlist = [1,2,3,4]
list1 = [str(num) for num in numlist]
r3 = list(map(str,numlist))

# 3.seq序列可以书写多个
# 注意:函数的形参个数必须和序列的个数保持一致
r4 = map(lambda x,y:x + y,[1,2,3],[4,5,6])#[自己添加:将相同位置下标的数字相加]
print(list(r4))

# 根据list1,生成一个新的序列,其中的元素为全大写
list1 = ['faf',"Htuaf","HFFF","fahgh"]
list2 = [word.upper() for word in list1]
r5 = map(lambda x:x.upper(),list1)

7.大练兵

# 封装函数,完成下面的操作
# 1.判断年份的平润性
def isleapyear(year):
    if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
        return  True
    return False

# 2.统计2~某个数范围内素数的个数
# a。判断一个数是否是素数
def isprime(num):
    if num < 2:
        return False
    else:
        result = True
        for i in range(2,num):
            if num % i == 0:
                result = False
                break
        # result中保存了是否是素数的结果
        return result

# b.统计个数
def getcount(x):
    count = 0
    for n in range(2,x + 1):
        if isprime(n):
            count += 1
    return count
r = getcount(100)

# 3.自定义函数,模拟sort的用法,默认升序,也可以降序
# list1 = []
# list1.sort()
# list1.sort(reverse=True)

def custom_sort(numlist,reverse=False):
    if reverse:
        # 降序
        for i in range(len(numlist) - 1):
            for j in range(i + 1,len(numlist)):
                if numlist[i] < numlist[j]:
                    numlist[i],numlist[j] = numlist[j],numlist[i]
    else:
        # 升序
        for i in range(len(numlist) - 1):
            for j in range(i + 1,len(numlist)):
                if numlist[i] > numlist[j]:
                    numlist[i],numlist[j] = numlist[j],numlist[i]
list1 = [34,65,6,57,100]
custom_sort(list1)
custom_sort(list1,True)
custom_sort(list1,reverse=True)
# 简单的会员管理系统
"""
功能:
    增加会员
    删除会员
    查看会员信息
    退出系统
"""

# 定义一个字典,用于存储会员信息,会员名作为key,会员密码作为value
user_dict = {}

# 当管理员的用户名和密码都为root的时候,才能操作会员管理系统
admin = pwd = "root"

# 一、封装函数
# 增加会员
def add_user():
    username = input("请输入你的用户名:")
    if username not in user_dict:
        password = input("请输入你的密码:")
        user_dict[username] = password
        print("添加成功!")
    else:
        print("用户名已经存在,无法添加")

# 删除会员
def del_user():
    username = input("请输入需要删除的用户名:")
    if username in user_dict:
        user_dict.pop(username)
        print("删除成功!")
    else:
        print("用户名不存在,无法删除")

# 查看单个会员信息
def find_single_user():
    username = input("请输入需要查询的用户名:")
    print(f"会员{username}的信息如下:")
    for key,value in user_dict.items():
        if key == username:
            print(f"用户名:{key},密码:{value}")
            break
    else:
        print(f"被查询的{username}不存在")

# 查看所有会员信息
def find_all_user():
    if len(user_dict) == 0:
        print("该系统中还没有会员信息,请先添加")
    else:
        print("所有会员的信息如下:")
        for key, value in user_dict.items():
            print(f"用户名:{key},密码:{value}")

# 二、调用函数
if __name__ == "__main__":
    print("欢迎进入xxx会员管理系统".center(40, "="))

    # 引导输入管理员的用户名和密码
    admin_username = input("请输入管理员的用户名:")
    admin_pwd = input("请输入管理员的密码:")

    if admin_username == admin and admin_pwd == pwd:
        print("登录成功!")
        while True:
            print("操作菜单".center(30, "*"))
            print("""
            1.添加会员
            2.删除会员
            3.查询单个会员信息
            4.查询所有会员信息
            5.退出系统""")
            choice = input("请输入需要进行的操作:")
            if choice.isdigit():
                choice = int(choice)
                if choice in range(1, 6):
                    if choice == 1:
                        add_user()
                    elif choice == 2:
                        del_user()
                    elif choice == 3:
                        find_single_user()
                    elif choice == 4:
                        find_all_user()
                    else:
                        print("欢迎下次光临")
                        break
                else:
                    print("没有此功能")
            else:
                print("输入有误")
    else:
        print("管理员用户名或者密码错误")
```




==8.大练兵==

python
#温故知新
""""
已知字典 dic = {"k1": "v1", "k2": "v2", "k3": "v3"},实现以
下功能

a.遍历字典 dic 中所有的key
b.遍历字典 dic 中所有的value
c.循环遍历字典 dic 中所有的key和value
d.添加一个键值对"k4","v4",输出添加后的字典 dic
e.删除字典 dic 中的键值对"k1","v1",并输出删除后的字典 dic
f.删除字典 dic 中 'k5' 对应的值,若不存在,使其不报错,
并返回None
g.获取字典 dic 中“k2”对应的值
h.已知字典dic2 = {'k1':"v111",'a':"b"} 编写程序,
使得dic2 = {'k1':"v111",'k2':"v2",'k3':"v3",'k4': 'v4','a':"b"}

"""
dic = {"k1": "v1", "k2": "v2", "k3": "v3"}

#a
for key in dic:
    print(key)

#b
for value in dic.values():
    print(value)

#c
for key,value in dic.items():
    print(key,value)

#d
dic["k4"] = "v4"
print(dic)

#e
dic.pop("k1")
print(dic)

#f
if dic.get("k5"):
    result = dic.pop("k5")
    print(result)
else:
    print(None)

#g
value = dic["k2"]

#h
dic2 = {'k1':"v111",'a':"b"}
for key,value in dic2.items():
    dic[key] = value

print(dic)

"""
.已知列表list1 = [11,22,11,33,44,55,66,55,66],统计列表中每个元素出现的次数,生成一个字典,结果为{11:2,22:1.....}
"""
list1 = [11,22,11,33,44,55,66,55,66]
dict1 = {}
for num in list1:
  if num not in dict1:
    dict1[num] = 1
  else:
    dict1[num] += 1
```


"""
.已知如下列表students,在列表中保存了6个学生的信息,
根据要求完成下面的题目

打印手机尾号是8的学生的名字
删除性别不明的所有学生
"""
students = [
{'name': '小花', 'age': 19, 'score': 90, 'gender': '女', 'tel':
'15300022839'},
{'name': '明明', 'age': 20, 'score': 40, 'gender': '男', 'tel':
'15300022838'},
{'name': '华仔', 'age': 18, 'score': 90, 'gender': '女', 'tel':
'15300022839'},
{'name': '静静', 'age': 16, 'score': 90, 'gender': '不明', 'tel':
'15300022428'},
{'name': 'Tom', 'age': 17, 'score': 59, 'gender': '不明', 'tel':
'15300022839'},
{'name': 'Bob', 'age': 18, 'score': 90, 'gender': '男', 'tel':
'15300022839'}
]

#打印手机尾号是8的学生的名字
for stu_dict in students:
    if stu_dict["tel"][-1] == "8":
        print(stu_dict["name"])

#删除性别不明的所有学生
# 法一
for stu_dict in students[::]:
    if stu_dict["gender"] == "不明":
        students.remove(stu_dict)
print(students)

# 法二
new_students = []
for stu_dict in students:
    if stu_dict["gender"] != "不明":
        new_students.append(stu_dict)
print(new_students)


"""
.写一个学生作业情况录入并查询的小程序
"""
a.录入学生作业情况:字典添加
b.查看学生作业情况:字典查询
c.录入时允许输入3次,3次输入不正确提示失败次数过多,禁止继续录入

homeworks = {
        'Amy':{'2018.3.22':'未交','2018.3.23':'已交'},
        'Lily':{'2018.3.22':'未交','2018.3.23':'未交'},
        }
chioce = {'1':'查询','2':'录入'} #定义字典,可以避免输入‘0’或‘1’以外的选择时报错
#user_chioce input是字符串,如果用int转化非数字的字符串会报错,所以将key定义为字符串‘1’,而非数字1
user_chioce = input('请输入您的选择:1为查询学生作业情况,2为录入学生作业情况').strip()
if chioce.get(user_chioce) == '查询': #用get方法,输入key不在字典中不会报错。用chioce[user_choice],输入key不在字典中会报错
    name = input('请输入要查询的学生姓名').strip()
    if name == '':
        print('查询学生姓名不能为空')
    elif name in homeworks: #判断key是否在字典中存在
        print('%s的作业情况是%s'%(name,homeworks[name]))#字典查询
    else:
        print('查询学生不存在')
elif chioce.get(user_chioce) == '录入':
    state = {'0':'未交','1':'已交'} #定义字典,可以避免输入‘0’或‘1’以外的选择时报错
    #放在循坏外,避免多次初始化,优化性能
    for i in range(3):
        enter_name = input('请输入要录入的学生姓名').strip()
        enter_date = input('请输入要录入学生作业的日期').strip()
        enter_state = input('请输入学生作业状态:0为未交,1为已交').strip()
        if state.get(enter_state):  #只要有状态就可以,不需要判断状态等于‘已交’或‘未交’
            if enter_name == '' or enter_date == '':
                print('学生姓名及作业日期不能为空')
            else:
                if enter_name in homeworks:
                    homeworks[enter_name].update({enter_date:state[enter_state]})#学生已存在,更新子字典
                else:
                    homeworks[enter_name] = {enter_date:state[enter_state]}#学生不存在,直接添加新k-v
                print('%s的作业情况是%s'%(enter_name,homeworks[enter_name]))
                print('所有学生作业情况为%s' % homeworks)
                break
        else:
            print('输入学生状态有误')
else:
    print('选择输入有误')


"""
用三个元组表示三门学科的选课学生姓名(一个学生可以同时选多门课)
a.求选课学生总共有多少人
b.求只选了第一个学科的人的数量和对应的名字
c.求只选了一门学科的学生的数量和对应的名字
d.求只选了两门学科的学生的数量和对应的名字
"""
#用三个元组表示三门学科的选课学生姓名(一个学生可以同时选多门课)
subject1 = ('stu1','stu2','stu4','stu5','stu7','stu9')
subject2 = ('stu1','stu3','stu4','stu6','stu8','stu9')
subject3 = ('stu3','stu2','stu6','stu8','stu9')

# a.求选课学生总共有多少人
s1 = set(subject3 + subject2 + subject1)
print("选课学生总共有%d人" % (len(s1)))

# b.求只选了第一个学科的人的数量和对应的名字
s2 = set(subject1) - set(subject2) - set(subject3)
print("只选了第一个学科的人的数量:%d,对应的名字:%s" % (len(s2),s2))

# c.求只选了一门学科的学生的数量和对应的名字
subject = subject3 + subject2 + subject1
# 存储学生的名字和出现的次数
dict1 = {}
for sub in subject:
    if sub not in dict1:
        dict1[sub] = 1
    else:
        dict1[sub] += 1
print(dict1)

# 存储只选了一门学科的学生的名字
one_list = []
for key,value in dict1.items():
    if value == 1:
        one_list.append(key)
print(one_list)

print("选了一门学科的学生的数量:%d,名字:%s" % (len(one_list),one_list))

# d.求只选了两门学科的学生的数量和对应的名字
subject = subject3 + subject2 + subject1
# 存储学生的名字和出现的次数
dict1 = {}
for sub in subject:
    if sub not in dict1:
        dict1[sub] = 1
    else:
        dict1[sub] += 1
print(dict1)

two_list = []
for key,value in dict1.items():
    if value == 2:
        two_list.append(key)
print(two_list)



"""
已知字符串:“this is a test of Python”

a.统计该字符串中字母s出现的次数
b.取出子字符串“test”
c.采用不同的方式将字符串倒序输出
d.将其中的"test"替换为"exam"
"""

str1 = "this is a test of Python"

#a.
#方式一
count1 = 0
for ch in str1:
    if ch == "s":
        count1 += 1
print(count1)

#方式二
count2 = str1.count("s")
print(count2)

#b
str2 = str1[10:14]
print(str2)

#c
#方式一
s1 = str1[::-1]
print(s1)

#方式二
s2 = ""
i = len(str1) - 1    #倒序遍历
while i >= 0:
    s2 += str1[i]   #拼接字符串
    i -= 1
print(s2)

#方式三
list1 = list(str1)
list1.reverse()

#d.将其中的"test"替换为"exam"        
#注意:但凡涉及字符串的更改,都是生成了一个新的字符串
str1 = "this is a test of Python"
str1.replace("test","exam")
print(str1)

"""
输入一个字符串,判断字符串中有多少个字母?多少个数字?多少个其他符号? 	

例如:'hello, nice to meet you. i am 18. my birthday is 1999-05-23'
  -- 结果: 字母的个数为33个,数字个数为10个, 其他字符为16个
"""

input_str = input("请输入:")
letter_count = 0
digit_count = 0 
other_count = 0

for ch in input_str:
    if ch.isalpha():  #有缺陷,最好还是需要通过(ch >= "a" and ch <= "z") or (ch >= "A" and ch <= "Z")判断
        letter_count += 1
    elif ch.isdigit():
        digit_count += 1
    else:
        other_count += 1


########正式开练############################################
"""
去除指定列表中与指定数据一样的所有元素,
例如: [19, 27, 32, 19, 28, 45, 19] 除去19  
 ----> [27, 32, 28, 45]
"""
#法一
def delete(num,list1):
    for i in list1:
        if i == num :
            list1.remove(num)
    return list1
list1 = [11,22,33,55,22,77,11]
print(delete(11,list1))

#法二
def del_element(list1,key):
  for ele in list1[::]:
    if ele == key:
      list1.remove(ele)
  return list1

"""
将指定字典中的键值交换,例如: {"a":97, "b":98} 
----> {97:"a", 98:"b"}
"""
#法一
def change(dict1):
    dict2 = {}
    for key,value in dict1.items():
        dict2[value] = key
    return dict2
dict1 = {'qef':1,'efq':2}
print(change(dict1))

#法二
def exchange(dict1):
    dict2 = {value:key for key,value in dict1.items()}
    return dict2



"""
求多个数中的最大值,要求:不能使用max系统函数,
例如:17, 28, 32, 45, 67, 57 -----> 67
"""
#法一
def newmax(*num1):
    max_num = 0
    for i in num1:
        if i >= max_num :
            max_num = i
    return max_num
#法二
def get_max(*num):
    max_value = num[0]
    for n in num:
        if n > max_value:
            max_value = n
    return max_value


"""
.写一个函数,默认求10的阶乘,也可以求其他数字的阶乘 
"""


# 法一
def factorial(num=10):
    total = 0
    for i in range(1,num + 1):
        total *= i
    return total
  
# 法二
import  functools
def factorial(num=10):
    result = functools.reduce(lambda x,y:x * y,range(1,num + 1))
    return result

"""
判断某个数是否是素数,返回结果
"""
#法一
def isprime(num):
    for i in range(2,num):
        if num % i == 0:
            result = f'{num}不是素数'
            break
    else:
        result = f'{num}是素数'
    return result
print(isprime(111))

#法二
def isprime(num):
    if num < 2:
        return False
    else:
        result = True
        for i in range(2,num):
            if num % i == 0:
                result = False
                break
        return result

"""
写一个函数,将指定字符串的首字母变成大写 
要求:不能使用字符串自带的方法capitalize,
例如: abc ---> Abc     123abc ---> 123abc
"""
#法一
def upfirst(str1=''):
    str1 = input("请输入字符串")
    str2 = ''
    if 97 <= ord(str1[0]) <= 122:
        i = chr(ord(str1[0])-32)
        str2 = i + str1[1:]
    return str2
print(upfirst())
#法二
def cus_capitalize(src_str):
    capital_str = ""
    if 'a' <= src_str[0] <= 'z': 
        capital_str += chr(ord(src_str[0]) - 32) + src_str[1:]
    else:
        capital_str = src_str
    return capital_str


"""
写一个函数,判断一个字符串是否已指定的字符串结束  
不能使用字符串自带的方法endswith,
例如: 字符串1:'abc231ab' 字符串2:'ab' 函数结果为: True
"""
#法一
def isends(str1='',str2=''):
    str1 = input("第一个字符串")
    str2 = input("第二个字符串")
    if str1[len(str1)-len(str2):] == str2:
        result = True
    else:
        result = False
    return result
print(isends())


#法二
def cus_ends(src_str, sub_str):
    return src_str[-len(sub_str):] == sub_str


"""
.封装一个函数,验证传入的正整数是几位数 ,
例如:1 ---> 1          18 -----> 2       139 -----> 3
"""

#法一
def long(nums):
    count = 0
    for _ in str(nums):
        count += 1
    return count
print(long(34))

#法二
def get_digit(num):
    digit = 1 
    while num // 10 != 0:
        digit += 1
        num //= 10
    return digit

"""
写一个函数,获取在指定列表中与指定数据相同的所有索引,
例如:[27, 32, 51, 28, 27]  27 ------> [0,4]
"""def get_index(src_list, ele):
    index_list = [] 
    for i in range(len(src_list)):
        if src_list[i] == ele: 
            index_list.append(i)
    return index_list 



#####################训练加强
"""
生成指定长度的验证码,要求:由数字和大小写英文字母构成的
随机字符串
"""
#法一
import  random
def rancode(lenth):
    import random,string
    total_str = string.digits + string.ascii_letters
    code_list = random.sample(total_str,lenth)
    code = ''.join(code_list)
    return code
print(rancode(7))

#法二
import  random
def get_code(num):
    total_list = []
    for i in range(65,91):
        total_list.append(chr(i))
    for j in range(97,123):
        total_list.append(chr(j))
    for k in range(10):
        total_list.append(str(k))
    # sample(),在指定的序列中,随机选择指定个数的元素
    code_list = random.sample(total_list,num)
    code = "".join(code_list)
    return code

"""
对字符串进行加密,默认字符串中只有小写字母和空格,
加密规则是a变d, b变e, c变f, ...., u变x, v变y, w变z,  x变a,
 y变b,  z变c,空格保持不变,例如: ab d ---> de g  
"""
#法一
def secret(str1 = 'abc y'):
    str2 = ''
    for i in str1:
        if 97 <= ord(i) <= 122:
            if ord(i)+3 > 122 :
                newi = chr(ord(i)-23)
                str2 += newi
            elif ord(i)+3 <= 122:
                newi = chr(ord(i) + 3)
                str2 += newi
        else:
            str2 += i
    return str2
print(secret())

#法二
def encryption(code):
    #声明一个字符串用于接收加密之后的结果
    result = ""
    #遍历code,加密前 和 加密后  3
    #chr()   ord()
    for ch in code:
        value = ord(ch)

        if 97 <= value <= 119:
            result += chr(value + 3)
        elif 120 <= value <= 122:
            result += chr(value - 23)
        else:
            result += chr(value)

    return result

print(encryption("45fhgs*"))

"""
.定义函数实现如下要求,例如:输入2,5,
则求2+22+222+2222+22222的和
"""

# 方式一
def get_num(num1,num2):
    sum1 = 0
    sum0 = 0
    for i in range(0,num2):
        sum1 = sum1 * 10 + num1
        sum0 += sum1
        if i == num2 - 1:
            continue
    return sum0

print(get_num(2,5))

# 方式二
def func_sum(x, y):
    c = str(x)
    s = 0
    list_num = []
    # 遍历y项 x,并且把它添加到列表中存储起来
    for i in range(1, y + 1):
        c *= i
        list_num.append(c)
        # 这里需要把c重新复原,否则会有很多c拼接起来
        c = str(x)
    print(list_num)
    for a in list_num:
        # 把提取出来的字符转转换为int型
        b = int(a)
        s += b
    return s

# 调用函数
func_sum(2, 5)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值