函数学习笔记2

习题1:
找到列表中第二大的数,可以用多种方法解决。
思路1:
找到最大的,删除掉,再找最大的

s = [1,2,3,-1,5,-2,4]
max_num = max(s)
s.remove(max_num)
max_num = max(a)
print("第二大的元素是:",max_num)

执行结果:
在这里插入图片描述

思路2:
排好序找倒数第二个

s = [1,2,3,-1,5,-2,4]
s.sort()

print("第二大的元素是:",s[-2])

执行结果:
在这里插入图片描述

思路3:
遍历,声明两个变量,一个存最大的,一个存第二大的,然后逐一比对。

s = [1,2,3,4,5,-1,-2]
max_num = s[0]
second_max_num = s[0]
for i in s:
    if i>=max_num:
        second_max_num = max_num
        max_num = i

print("第二大的元素是:",second_max_num)

执行结果:
在这里插入图片描述

冒泡排序:
s = [-1,1,-2,2,3,-3]
第一步:交换2个元素
交换的方法1:a,b = b,a
交换的方法2:
temp = b
b = a
a = temp
第二步:我要找到这个list中最大的元素,把它放到列表的最后位置
位置0和位置1比,如果大,交换,否则不换
位置1和位置2比,如果大,交换,否则不换
位置2和位置3比,如果大,交换,否则不换
。。。
位置4和位置5比,如果大,交换,否则不换

1、基于坐标遍历,最后一个元素不需要做遍历动作
遍历的反射:
1)把元素逐一取出
2)基于坐标位置逐一取出来,i,i+1

s = [-1,1,-2,2,3,-3]
for i in range(len(s)-1):
    if s[i] > s[i+1]:
        temp = s[i]
        s[i] = s[i+1]
        s[i+1] = temp

print(s)

2、使用if当前元素和后一个元素做比对,如果大了,交换,否则啥也不做
把最后1个元素我不处理了,把之前的所有的数,在做相同的动作,找到第2大元素

s = [-1,1,-2,2,3,-3]
for i in range(len(s)-1-i):
    if s[i] > s[i+1]:
        temp = s[i]
        s[i] = s[i+1]
        s[i+1] = temp

print(s)

把最后2个元素我不处理了,把之前的所有的数,在做相同的动作,找到第3大元素
把最后3个元素我不处理了,把之前的所有的数,在做相同的动作,找到第4大元素
。。。
把最后n-1个元素我不处理了,把之前的所有的数,在做相同的动作,找到第n大元素

s = [-1,1,-2,2,3,-3]
for j in range(len(s)-1):
    for i in range(len(s)-1-j):
        if s[i] > s[i+1]:
            temp = s[i]
            s[i] = s[i+1]
            s[i+1] = temp

print(s)

执行结果:
在这里插入图片描述
习题2:
python代码得到2个列表的交集与差集
不许用set
交集思路:遍历list1,判断是否在list2中,在的话,则存入一个列表中。
差集思路:分别遍历list1和2,如果不在对方的list中,则存入一个列表中。

s1 = [1,2,3,9,10]
s2 = [2,3,9,11]
result = []
for i in s1:
    if i in s2:
        result.append(i)

print("交集:",result)

执行结果:
在这里插入图片描述

s1 = [1,2,3,9,10]
s2 = [2,3,9,11]
result = []
for i in s1:
    if i not in s2:
        result.append(i)

for i in s2:
    if i not in s1:
        result.append(i)

print("差集:",result)

执行结果:
在这里插入图片描述
差集的实现方法2:两个集合的并集减去交集

s1 = [1,2,3,9,10]
s2 = [2,3,9,11]

result1 = []
result2 = []

for i in s1:
    if i in s2:
        result1.append(i)

print("交集",result1)
s1=s1+s2
for i in s1:
    if i not in result1:#不在交集里面的元素就是我想要的
        result2.append(i)

print("差集",result2)

执行结果:
在这里插入图片描述
函数:类外面的函数定义叫做函数
方法:类内部定义的函数叫做方法

求一个字符串中的字母个数,需要判断传入参数的类型。
加个要求,必须使用ASCII来判断是否是字母

def count_letter_num(s):
    if not isinstance(s,str):
        return None
    result = 0
    for i in s:
        if ord(i)>=65 and ord(i)<=90\
           or ord(i)>=97 and ord(i)<=122:
            result+=1
    return result

print("包含的字母个数 ",count_letter_num("I am a boy!"))

执行结果:
在这里插入图片描述
不可变对象:所有的数字、字符串、元组
可变对象:set dict list 实例
参数传不可变对象的时候,函数内外变量值是独立的
参数传可变对象的时候,函数内外变量值是关联的

在函数内部,使用global变量,会对外部变量有影响。

小练习:
要求有个值result来存结果
1 a,b数字,相加
2 a,b字符串,就当做字符串相加
3 a,b list,就当做list相加
4 不满足条件,则返回None

def add(a,b):
    if isinstance(a,(int,float))and isinstance(b,(int,float)):
        result = 0
    elif isinstance(a,str)and isinstance(b,str):
        result = ""
    elif isinstance(a,list)and isinstance(b,list):
        result = []
    else:
        return None
    result = a+b
    return result

print(add("1","2"))
print(add(1,2))
print(add([1],[2]))
print(add([1],"2"))

在这里插入图片描述
正向代理:
客户端和服务器之间的一个服务器或者是软件,负责转发用户的请求到源服务器。
发给不同的公司服务器
在你公司的局域网,某第三方服务器

反向代理:
在被访问服务器的局域网内,你的请求被它收到了之后,会被反向代理服务器解析你的请求url,然后将请求转发给不同的服务器处理。
反向代理+你要访问的服务器是一组,是一个公司开发的。
外人不知道。

使用元组作为函数的参数

def add(a,b,*arg):
    print(type(arg))
    print(arg)
    for i in arg:
        print(i)

print(add(1,2,3,4,5,6))

在这里插入图片描述

小练习:
输入5个字母,声明一个可变参数的函数,给我拼成一个单词。

def word_fun(*arg):
    result = ""
    for i in arg:
        result+=i
    return result

print(word_fun('a','b','c','d','e'))

在这里插入图片描述
使用字典作为函数的参数

def add(**kw):
    print(type(kw))
    print(kw)
    for i in kw:
        print(i)
    for j in kw.values():
        print(j)

print(add(a="1",b=2,c=3))

在这里插入图片描述
小练习:
使用必填参数、默认参数、可变元组参数、可变字典参数
计算一下单词的长度之和。

def count_letter_num(a,b="abc",*arg,**kw):
    result = 0
    result += len(a)
    result += len(b)
    for i in arg:
        result+=len(i)
    for i in kw.values():
        result+=len(i)
    return result

print(count_letter_num("a","b","c""d","e",x="f",y="g"))#"a"赋值给参数a了,"b"给了参数b,c,d,e给了arg,x,y给kw做key,f,g作为kw的value
print(count_letter_num("a"))
print(count_letter_num("a",c="x"))  

在这里插入图片描述
六剑客解决一行代码解决问题:
1 lambda
2 切片
3 map
4 filter
5 reduce
6 推导列表

list(map(str,[1,2,3]))

在这里插入图片描述

 list(map(lambda x:x+1,[1,2,3]))

在这里插入图片描述

def f(n):
    if n>='a' and n<='z':
        return n

list(filter(f,"AhgtSDFnik"))

在这里插入图片描述

from functools import reduce
reduce(lambda x,y:x+y,[1,2,3,4])

第一次计算:x=1,y=2
第二次计算:x=3,y=3
第三次计算:x=6,y=4
6+4=10
在这里插入图片描述
递归:(效率不高)
1 在函数中,自己调用自己
2 函数中一定要有结束递归的条件。
建议:使用3次调用,来分析递归调用的过程
累加:1+2+3+4+5

def add(n):
    if n == 1:
        return 1
    return add(n-1)+n    

print(add(3))
print(add(4))
print(add(5))

在这里插入图片描述
n设为3
n=3:第一次调用:add(3-1)+3—>add(2)+3 = 3+3=6
第二次调用:add(2-1)+2—>add(1)+2 = 1+2=3
第三次调用:add(1)—>return 1

fib 数列:
1 1 2 3 5 8 13
a1=1
a2=1
sum=a1+a2
a1=a2
a2=sum

非递归的算法:

def fib(n):
    if n <= 0 or not isinstance(n,int):
        return []
    result = []
    a1=1
    a2=1
    if n == 1:
        return result.append(a1)
    if n == 2:
        result.append(a1)
        return result.append(a2)
    result = [1,1]
    for i in range(n-2):
        temp = a1+a2
        result.append(temp)
        a1=a2
        a2=temp
    return result

print(fib(3))
print(fib(4))
print(fib(5))

在这里插入图片描述
方法2:

def fib(n):
    result = []
    if n <= 0 or not isinstance(n,int):
        return result
    for i in range(n):
        if i < 2:
            result.append(1)
        else:
            result.append(result[i-1]+result[i-2])
    return result

print(fib(3))
print(fib(4))
print(fib(5))
print(fib(6))

在这里插入图片描述
递归的算法:

def fib(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fib(n-1)+fib(n-2)

print(fib(1))
print(fib(2))
print(fib(3))
print(fib(4))
print(fib(5))
print(fib(6))

在这里插入图片描述
n3:fib(2)+fib(1)---->1+1
n
4:fib(3)+fib(2)---->1
fib(3)->fib(2)—>1+fib(1)---->1=2

练习:
将列表a = [1,2,[3,4,[5,6,7,[8,9,[10,11]]]]]里面的元素放到一个单层列表里面。[1,2,3,4,5,6,7,8,9,10,11]

a = [1,2,[3,4,[5,6,7,[8,9,[10,11]]]]]

def iter_list(l):
    for i in l:
        if isinstance(i,list):
            iter_list(i)
        else:
            print(i,end=" ")

print(iter_list(a))

在这里插入图片描述

def iter_list(l,result=[]):
    for i in l:
        if isinstance(i,list):
            iter_list(i,result)
        else:
            #print(i)
            result.append(i)
    return result

a = [1,2,[3,4,[5,6,7,[8,9,[10,11]]]]]
result = []
print(iter_list(a,result))

在这里插入图片描述

a = [1,2,[3,4,[5,6,7,[8,9,[10,11]]]]]
iter_list(a)
def iter_list(l,result=[]):
    for i in l:
        if isinstance(i,list):
            iter_list(i,result)
        else:
            #print(i)
            result.append(i)
    return result

a = [1,2,[3,4,[5,6,7,[8,9,[10,11]]]]]
print(iter_list(a))

在这里插入图片描述
1、只要不是永远执行自己调用自己,就肯定会在某个时刻递归结束
2、分析2-3次递归调用就可以了
3、递归调用过程的成果,需要使用list来进行保存。

练习:求两个数的最大公约数
方法一:

def greatest_common_division(a,b,c=0,result=[]):
    if c == 0:
        if a<b:
            c=a
        else:
            c=b
    if a%c ==0 and b%c ==0:
        result.append(c)
    else:
        greatest_common_division(a,b,c-1)
    return result[-1]

print(greatest_common_division(10,8))
print(greatest_common_division(10,5))

在这里插入图片描述
方法二:更相减损法

def get(small,big):
    if small > big:
        small,big = big,small
    if small == big:
        return small
    return get(small,big-small)

print(get(10,8))
print(get(10,5))

在这里插入图片描述
方法三:辗转相除法

def gain(small,big):
    if small > big:
        small,big = big,small
    if small == 0:
        return big
    return gain(small,big % small)

print(gain(10,8))
print(gain(10,5))

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值