首页 > 编程语言 >聪明办法学 Python第5节:循环

聪明办法学 Python第5节:循环

时间:2024-06-22 10:59:43浏览次数:30  
标签:return Python range 聪明 循环 time print total def

作业链接:https://hydro.ac/d/datawhale_p2s/user/53146

for 循环和循环范围

for 循环的特点

基于提供的范围,重复执行特定次数的操作

def sumFromMToN(m, n):
    total = 0
    # 注意: range(x, y) 是左闭右开区间,包含 x,不包含 y
    for x in range(m, n+1):
        total += x
    return total

sumFromMToN(5, 10) #45
sumFromMToN(5, 10) == 5+6+7+8+9+10  #True

range() 是个什么东西?

其实在这里,我们也可以不用循环来完成同样的任务

def sumFromMToN(m, n):
    return sum(range(m, n+1))

sumFromMToN(5, 10) #45
  如果我们省略第一个参数会发生什么?
def sumToN(n):
    total = 0
    # range 起始范围默认为 0
    for x in range(n+1):
        total += x
    return total

sumToN(5) #15

那如果我们添加第三个参数呢?

def sumEveryKthFromMToN(m, n, k):
    total = 0
    # 第三个参数为 “步长” step
    for x in range(m, n+1, k):
        total += x
    return total

sumEveryKthFromMToN(5, 20, 7) == (5 + 12 + 19) #True

只对从 m 到 n 的 奇数求和

# 我们也可以通过修改循环内部的代码来改变步长

def sumOfOddsFromMToN(m, n):
    total = 0
    for x in range(m, n+1):
        if x % 2 == 1:
            total += x
    return total

sumOfOddsFromMToN(4, 10) == sumOfOddsFromMToN(5,9) == (5+7+9) #True

for 循环嵌套

# 下面的代码将输出二维坐标

def printCoordinates(xMax, yMax):
    for x in range(1, xMax+1):
        for y in range(1, yMax+1):
            print(f"( {x} , {y} )  ", end="")
        print()

printCoordinates(5, 5)

#( 1 , 1 )  ( 1 , 2 )  ( 1 , 3 )  ( 1 , 4 )  ( 1 , 5 )  
#( 2 , 1 )  ( 2 , 2 )  ( 2 , 3 )  ( 2 , 4 )  ( 2 , 5 )  
#( 3 , 1 )  ( 3 , 2 )  ( 3 , 3 )  ( 3 , 4 )  ( 3 , 5 )  
#( 4 , 1 )  ( 4 , 2 )  ( 4 , 3 )  ( 4 , 4 )  ( 4 , 5 )  
#( 5 , 1 )  ( 5 , 2 )  ( 5 , 3 )  ( 5 , 4 )  ( 5 , 5 ) 

如果换成 * 呢?

def Stars(n, m):
    # 输出一个 n*m 的星型矩阵图
    for row in range(n):
        for col in range(m):
            print("*", end="")
        print()

Stars(5, 5)
#*****
#*****
#*****
#*****
#*****

换一种写法

# be careful! 这些代码与之前的有什么不同?

def printMysteryStarShape(n):
    for row in range(n):
        print(row, end=" ")
        for col in range(row):
            print("*", end=" ")
        print()
printMysteryStarShape(5)

#0 
#1 * 
#2 * * 
#3 * * * 
#4 * * * * 

while 循环

当你不知道循环什么时候停下来的时候,为什么不试试 while

找出一个数最左边的那一位的数值(12345 的 1 )

# 我不知道它什么时候停下来

def leftmostDigit(n):
    n = abs(n)
    while n >= 10:
        n = n//10
    return n 

leftmostDigit(46535248) #4

举个例子:依次找出 n 个 4 或者 7 的整数倍非负整数

def isMultipleOf4or7(x):
    return ((x % 4) == 0) or ((x % 7) == 0)

def nthMultipleOf4or7(n):
    found = 0
    guess = -1
    while found <= n:
        guess += 1
        if isMultipleOf4or7(guess):
            found += 1
    return guess

print("4 或 7 的倍数: ", end="")
for n in range(15):
    print(nthMultipleOf4or7(n), end=" ")
#4 或 7 的倍数: 0 4 7 8 12 14 16 20 21 24 28 32 35 36 40 

在知道循环范围的情况下尽量使用 for

break 与 continue 语句

for n in range(200):
    if n % 3 == 0:
        continue # 跳过这次循环
    elif n == 8:
        break # 跳出当前整个循环
    else:
        pass # 啥也不做,占位符(不会被运行)
    print(n, end=" ")

#1 2 4 5 7 

假·死循环

与环境交互后,在特定条件下终止的循环

判断一个数是不是质数

# 不是最快的写法,但最容易理解

def isPrime(n):
    if n < 2:
        return False
    for factor in range(2,n):
        if n % factor == 0:
            return False
    return True
for n in range(100):
    if isPrime(n):
        print(n, end=" ")
# 快了一点

def fasterIsPrime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:  
        return False #大于2的偶数不是
    maxFactor = round(n**0.5)  #求出根号n
    for factor in range(3, maxFactor+1, 2):
        if n % factor == 0:
            return False   #有3到根号n之间的因数的不是
    return True

验证

# 验证他它俩结果是一样的
for n in range(100):
    assert(isPrime(n) == fasterIsPrime(n))
print("两种解法的结果一致")


#验证时间
import time

bigPrime = 102030407
print("Timing isPrime(",bigPrime,")", end=" ")

# isPrime
time0 = time.time()
print(", returns ", isPrime(bigPrime), end=" ")

time1 = time.time()
print(", time = ",(time1-time0)*1000,"ms\n")

# fasterIsPrime
print("Timing fasterIsPrime(",bigPrime,")", end=" ")
time0 = time.time()

print(", returns ", fasterIsPrime(bigPrime), end=" ")
time1 = time.time()

# result
print(", time = ",(time1-time0)*1000,"ms")


#Timing isPrime( 102030407 ) , returns  True , time =  4708.568811416626 ms

#Timing fasterIsPrime( 102030407 ) , returns  True , time =  0.4515647888183594 ms

nth Prime

依次找出第 n 位质数

def nthPrime(n):
    found = 0
    guess = 0
    while found <= n:
        guess += 1
        if fasterIsPrime(guess):
            found += 1
    return guess

for n in range(10):
    print(n, nthPrime(n))
print("Done!")

# 0 2
# 1 3
# 2 5
# 3 7
# 4 11
# 5 13
# 6 17
# 7 19
# 8 23
# 9 29
# Done!

总结

  • For 循环用于指定范围的重复操作。
  • range() 可以生成一个数字范围。
  • 在不知道循环什么时间停止的时候,应该试试 While 循环。
  • 循环同样也是可以嵌套的。
  • 巧妙地使用 break 和 continue 语句。
  • 合理的剪枝,缩小搜索范围/循环范围,可以大幅提高程序运行效率。

标签:return,Python,range,聪明,循环,time,print,total,def
From: https://blog.csdn.net/m0_53743757/article/details/139876500

相关文章

  • 「Python爬虫」最细致的讲解Python爬虫之Python爬虫入门(一)
    一、认识爬虫1.1、什么是爬虫?爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息。1.2、Python爬虫架构调度器:相当于一台电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取UR......
  • Python进大厂比赛中的特征工程与模型训练
    Python进大厂比赛中的特征工程与模型训练一、引言二、技术概述特征工程模型训练三、技术细节特征工程模型训练四、实战应用五、优化与改进特征工程模型训练六、常见问题特征工程模型训练七、总结与展望一、引言Python作为数据科学界的明星语言,其在机器学习、数......
  • 超越datetime:Arrow,Python中的日期时间管理大师
    介绍Arrow是一个Python库,它提供了一种合理且对人类友好的方法来创建、操作、格式化和转换日期、时间和时间戳。它实现了对datetime类型的更新,填补了功能上的空白,提供了一个智能的模块API,支持许多常见的创建场景。简单来说,它可以帮助您使用更少的导入和更少的代码来处理日期和时间......
  • python期末考试(个人理解)主要内容为函数和文件与数据格式化(三)持续更新
    如有错误,敬请更新!!!函数的概述:将一串代码打包成一个包,为了以后方便使用函数的定义:使用关键字(保留字)def来定义defmy_function():  #函数体  print("Hello,World!")函数的调用#定义一个函数,它接受两个参数并返回它们的和defadd_numbers(a,b):  result=......
  • 【for循环】水仙花数
    【for循环】水仙花数时间限制:1000ms内存限制:65536KB【题目描述】【参考代码】#include<iostream> usingnamespacestd; intmain(){ for(intabc=100;abc<=999;abc++){//获取范围内所有的数字 intc=abc%10;//获取个位 intb......
  • 运筹学练习Python精解——整数规划
    练习1一汽车厂生产小、中、大三种类型的汽车,已知各类型每辆车对钢材、劳动时间的需求,利润以及每月工厂钢材、劳动时间的现有量如下表所示,试制定月生产计划,使工厂的利润最大。进一步讨论:由于各种条件限制,如果生产某一类型汽车,则至少要生产80辆,那么最优的生产计划应作何改变。......
  • python笔记
    pythonflatten()flatten()方法用于将多维数组转换为一维数组:#创建一个二维数组array_2d=np.array([[1,2,3],[4,5,6]])#使用flatten()方法将其展平为一维数组array_1d=array_2d.flatten()print(array_1d)输出结果是:[1,2,3,4,5,6]是X.flatten()[:......
  • python---计算器界面以及功能
    代码:importtkinterastkfromtkinterimport*root=Tk()root.title("calculate")result_num=tk.StringVar()result_num.set('')#在Tkinter中,StringVar是一个特殊的变量类,它用于与Tkinter的某些部件(如标签Label、条目Entry等)的文本属性进行双向绑定。        ......
  • python---学生通讯录
    代码:importcsvstudents=[]defmenu():    print("学生信息管理")    print("1.显示学生信息")    print("2.添加学生信息")    print("3.删除学生信息")    print("4.保存学生信息")    print("5.退出")defadd():    student={}    ......
  • 2024年华为OD机试真题-分披萨-(C++/Java/python)-OD统一考试(C卷D卷)
    题目描述"吃货"和"馋嘴"两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。但是粗心的服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。由于两人都想吃到最多的披萨,他们商量了一个他们认为公平的分法:从"吃货"开始,轮流......