有趣的小练习
使用生成器实现range()函数
| def my_range(start, stop=None, step=1): |
| if not stop: |
| stop = start |
| start = 0 |
| while start < stop: |
| yield start |
| start += step |
| for i in my_range(0, 10, 2): |
| print(i) |
- 以下是使用递归做的类range()函数,但是执行效果并不理想,直接进行了打印操作的执行,有点类似python2.0版本的range哈哈哈哈
| def index(start, stop=None, step=1): |
| if not stop: |
| stop = start |
| start = 0 |
| if start >= stop: |
| return stop |
| print(start) |
| return index(start=start + step, stop=stop, step=step) |
| index(10, 20) |
算法-二分法
- 二分法
- 基本逻辑就是将数据一分为二,与所需要查找的内容进行大小比较
- 二分法操作的前提是需要将数据进行排序
| |
| list1 = [1, 2, 3, 4, 5, 9, 89, 567, 34, 4562, 56] |
| |
| list1.sort() |
| |
| num_find = input('请输入要查找的数字:').strip() |
| num_find = int(num_find) |
| def half(data_list, target_num): |
| |
| try: |
| mid_index = len(data_list) // 2 |
| |
| if target_num > data_list[mid_index]: |
| |
| list_right = data_list[mid_index + 1:] |
| |
| |
| |
| return half(list_right, target_num) |
| |
| elif target_num < data_list[mid_index]: |
| |
| |
| list_left = data_list[:mid_index] |
| |
| return half(list_left, target_num) |
| |
| else: |
| |
| return "在表中找到了!" |
| except IndexError: |
| |
| return f"表中不存在!" |
| print(half(list1, num_find)) |
生成器面试题
| |
| def add(n, i): |
| return n + i |
| |
| def test(): |
| for i in range(4): |
| yield i |
| g = test() |
| for n in [1, 10]: |
| g = (add(n, i) for i in g) |
| |
| res = list(g) |
| print(res) |
| |
| |
| |
| |
| |
| |
| def add(n, i): |
| return n + i |
| |
| def test(): |
| for i in range(4): |
| yield i |
| g = test() |
| for n in [1, 10]: |
| g = (add(n, i) for i in g) |
| ''' |
| 一共2次循环,n 第一次等于1,n 第二次等于 10 |
| 第一次,n = 1 |
| g = ((add(n, i) for i in g) |
| 只是一个生成器,并未被调用 |
| 第二次,n = 10 |
| g = ((add(n, i) for i in ((add(n, i) for i in g)) |
| 就相当于 for 循环了生成器,所以生成器被调用了 |
| g = ((add(10, i) for i in ((add(10, i) for i in g)) |
| 答案从20起始,因为 for 循环的第一个值等于10,而add()函数的第一个也等于10 |
| 答案中只有C符合条件 |
| ''' |
| res = list(g) |
| print(res) |
| |
| |
| |
| |
| |
动态的展示日志最后一条
| 实现动态查看最新一条日志的效果 |
| import time |
| |
| |
| with open('access.log', mode='rb') as f: |
| f.seek(0, 2) |
| while True: |
| line = f.readline() |
| if len(line) == 0: |
| |
| time.sleep(0.5) |
| else: |
| print(line.decode('utf-8'), end='') |
计算列表单词出现的次数
| words = 'my name is lea4ning , my age is 20 ' |
| words_list = words.split(' ') |
| words_count = {} |
| for i in words_list: |
| if i in words_count: |
| words_count[i] += 1 |
| elif i not in words_count: |
| words_count[i] = 1 |
| print(words_count) |
| |
使用列表展示堆和栈的概念
| |
| ll = [] |
| ll.append(111) |
| ll.append(222) |
| ll.append(333) |
| print(ll) |
| print(ll.pop(0)) |
| print(ll.pop(0)) |
| print(ll.pop(0)) |
| |
| ''' |
| [111, 222, 333] |
| 111 |
| 222 |
| 333 |
| ''' |
| |
| |
| ll2 = [] |
| ll2.append(111) |
| ll2.append(222) |
| ll2.append(333) |
| print(ll2) |
| print(ll2.pop()) |
| print(ll2.pop()) |
| print(ll2.pop()) |
| |
| ''' |
| [111, 222, 333] |
| 333 |
| 222 |
| 111 |
| ''' |
递归练习
以下是一些递归练习题,从简单到难:
- 计算阶乘: 编写一个递归函数,计算给定正整数
n
的阶乘。
- 斐波那契数列: 编写一个递归函数,计算斐波那契数列的第
n
项。斐波那契数列的定义是:F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2)
。
- 反转字符串: 编写一个递归函数,将输入的字符串反转。例如,输入字符串 "hello",输出 "olleh"。
- 二进制搜索: 实现一个递归函数,在有序整数列表中执行二进制搜索。函数应该返回目标元素的索引,如果不存在,则返回 -1。
- 二分法
- 二进制搜索(Binary Search)是一种在有序数组中查找特定元素的算法。算法的基本思想是通过将数组分成两半,然后比较目标值与中间元素的大小关系,从而确定目标值可能在数组的哪一半中。
- 汉诺塔问题: 实现汉诺塔问题的递归解法。汉诺塔是一个经典问题,要求将一堆盘子从一个柱子移动到另一个柱子,其中大盘子不能放在小盘子上。
- 子集生成: 编写一个递归函数,生成给定集合的所有子集。
- 图的深度优先搜索(DFS): 实现图的深度优先搜索算法,以找到图中的所有节点。
- 归并排序: 实现归并排序算法,其中包括递归步骤。将一个列表分为两半,分别对两半进行排序,然后合并两个有序列表。
阶乘
| |
| |
| |
| def factorial(n): |
| if n == 0 or n == 1: |
| return 1 |
| return n * factorial(n - 1) |
| print(factorial(5)) |
斐波那契
| |
| def fib(n): |
| if n == 0: |
| return 0 |
| elif n == 1: |
| return 1 |
| return fib(n-1) + fib(n-2) |
| print(fib(10)) |
反转字符串
| |
| def reverse_string(input_str): |
| |
| if len(input_str) <= 1: |
| return input_str |
| |
| |
| first_char = input_str[0] |
| last_char = input_str[-1] |
| |
| |
| reversed_substring = reverse_string(input_str[1:-1]) |
| |
| |
| reversed_str = last_char + reversed_substring + first_char |
| |
| return reversed_str |
| |
| |
| input_string = "hello" |
| result = reverse_string(input_string) |
| print(result) |
二分法
| |
| def half_num(list, target): |
| try: |
| half_index = len(list) // 2 |
| if target > list[half_index]: |
| new_list = list[half_index+1:] |
| return half_num(new_list, target) |
| elif target < list[half_index]: |
| new_list = list[:half_index] |
| return half_num(new_list, target) |
| else: |
| return half_index |
| except IndexError: |
| return -1 |
| lis1 = [1, 2, 3, 4, 5, 6, 7] |
| target = int(input("请输入想要查找的数字,不存在则为-1,存在则返回索引值:").strip()) |
| print(half_num(lis1, target)) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了