> 本文以GitHub上100天python从新手到大师为素材,规划为约100天的练习,每次的学习和总结均发在这里。有错误的地方还请朋友们指正。

函数的作用

如下面有一个问题,计算三个三角形的面积。 如果只运用之前所学的知识,我们需要复制粘贴三遍之前我们写的海伦公式代码:

a = float(input("输入第一条边的长度: "))
b = float(input("输入第二条边的长度: "))
c = float(input("输入第三条边的长度: "))if a + b > c and a + c > b and b + c > a:perimeter = a + b + cp = perimeter / 2area = (p * (p - a) * (p - b) * (p - c))**0.5print("perimeter is %.2f narea is %.2f" %(perimeter,area))
else:print("该边长组不成立三角形")

而函数的出现可以使我们将这类功能封进函数里,每当我们想要调用此功能时,我们只需要调用该函数即可。例如:

def tri_area(a,b,c):if a + b > c and a + c > b and b + c > a:perimeter = a + b + cp = perimeter / 2area = (p * (p - a) * (p - b) * (p - c)) ** 0.5return areaelse:print('无法计算面积')print(tri_area(2,4,5))
print(tri_area(3,4,5))
print(tri_area(2,4,7))

定义函数

参照上面的例子,我们使用关键词def来构建函数,后面的括号内可以放入传进函数内的参数,python的函数定义和数学中的函数定义类似,传入函数的参数可以理解为自变量,经过函数变换后我们可以使用return返回需要的结果,可以理解为函数中的因变量。

函数的参数

函数的参数有多种写法,除将变量名写进括号内外,我们也可以采用默认值,即预先规定好参数的值,例如我们写一个扔骰子并求和的函数,默认函数内有两个筛子:

from random import randintdef Throw_the_dice(n=2):total = 0for i in range(n):total += randint(1,6)return total

这样子是默认两个骰子扔出并求和,如果想要3个筛子求和,就直接输入Throw_the_dice(3)即可。

但在我们利用函数解决问题的过程中,可能我们并不知道函数具体要传入几个参数(例如求和问题中我们可能事先不知道是几个数求和)。我们可以使用可变参数。

下面利用求和函数来演示

def add(*args):total = 0for i in args:total += ireturn  total

*args 可以承载多个数据传入函数中,例如:

print(add(1,2,3))

用模块管理函数

有时候我们在和别人共同开发时,会遇到函数名冲突的情况,例如:

def foo():print("hello python")def foo():print("hello world")print(foo())

那么最后结果只会打印第二个函数的结果,因为第一个函数已经被覆盖住。如果想两个函数都被打印出来,我们可以采用模块管理函数。

还是用两个foo函数举例。

新建一个python文件命名为module2.py

#module2.py#
def foo():print("hello python")

再新建一个python文件名为module3.py

#module3.py#
def foo():print("hello world")

如果我们想分别使用这两个函数,可以引用模块:

from module2 import foo
foo()from module3 import foo
foo()#或者#import module2 as md2
import module3 as md3
m2.foo()
m3.foo()

这样子两个函数都可以打印 但当这样子引用的时候:

from module2 import foo
from module3 import foo
foo()
foo()

则打印结果出来的都是第二个函数的结果,因为第一个函数也被覆盖了。

在模块中我们还会遇到别的代码,例如:

#module3.py#
print("干扰文字")def foo():print(foo())

如果引用这个模块使用foo函数,那么module3内的其余执行代码也会一并执行,输出两行文字。

为了避免这种情况,我们可以这样写

def foo():print("Hello World")if __name__ == "__mian__":print("干扰文字")

这样子只有在直接执行文件时才可以运行全部代码,而导入模块时他的名字时module3而不是main

练习部分

实现计算最大公约数和最小公倍数

代码如下:

def gcd_lcd(x,y):if x > y:x ,y = y, x #保证x比y小#gcd_num = 1for i in range(x,0,-1):if x%i == 0 and y%i == 0:gcd_num = ibreaklcd = x * y / gcd_numreturn gcd_num, lcd

官方代码如下:

def gcd(x, y):"""求最大公约数"""(x, y) = (y, x) if x > y else (x, y)for factor in range(x, 0, -1):if x % factor == 0 and y % factor == 0:return factordef lcm(x, y):"""求最小公倍数"""return x * y // gcd(x, y)

判断一个数是不是回文数

Tips:回文数即从前往后和往后往前看时一样的

def palindromic(num):sum_total = 0here = numwhile True:sum_total = sum_total*10 + (num % 10)if num // 10 == 0:breakelse:num = num//10return  sum_total == here

官方代码如下:

def is_palindrome(num):"""判断一个数是不是回文数"""temp = numtotal = 0while temp > 0:total = total * 10 + temp % 10temp //= 10return total == num

判断一个数是不是素数

def is_prime(num):kaigen = int(num**0.5)+1test_num = 2not_prime = Truewhile not_prime:if num % test_num == 0 and num > 1 :return Falsenot_prime = Falseelif test_num < kaigen:test_num += 1else:return Truebreak

官方代码如下:

def is_prime(num):"""判断一个数是不是素数"""for factor in range(2, num):if num % factor == 0:return Falsereturn True if num != 1 else False

判断输入的正整数是不是回文素数

def alltrue(num):if is_prime(num) and palindromic(num):return Trueelse:return False

官方如下:

if __name__ == '__main__':num = int(input('请输入正整数: '))if is_palindrome(num) and is_prime(num):print('%d是回文素数' % num)

在这里我们看到,如果我们将两个函数组合起来可以解决更复杂的问题,这就是我们构建函数的意义。

变量作用域

最后我们讨论变量作用域的问题。参考一下代码:

def foo():a = 100print(a)  # 200if __name__ == "__main__":a = 200foo()

最终打印输出的a的值是多少呢?是100。因为在函数内a就寻找到100的取值,就不需要再去全局寻找变量值了。

变量作用域分为4种,分别为全局变量、嵌套变量、局部变量和内置变量。全局变量意思为跳脱函数外对于全局都有影响的变量,由于函数内部也可以嵌套函数,则第一层函数内、第二层函数外的变量即为嵌套变量,函数内的是局部变量,因为该变量只影响局部。内置变量即def、if、else等这些关键词。

下面用一段代码统一演示:

def foo():b = 'hello'# Python中可以在函数内部再定义函数def bar():c = Trueprint(a)print(b)print(c)bar()# print(c)  # NameError: name 'c' is not definedif __name__ == '__main__':a = 100# print(b)  # NameError: name 'b' is not definedfoo()

再回到最开始的例子,那么如何改变a的值,使得打印的a也为200呢? 我们可以使用下面的方法:

def foo():global aa = 200print(a)  # 200if __name__ == '__main__':foo()print(a)  # 200

通过global a来指示函数内a的值置于全局,即使全局没有该变量,在后面仍可以使用这个变量。

在我们正常编程当中,应当避免使用过多的全局变量,因为全局变量的生命周期长、影响过于广泛。

problem c: 判断素数的函数_python100天 — Day 6 函数和模块的使用相关推荐

  1. 本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。

    其中函数prime当用户传入参数p为素数时返回1,否则返回0:函数PrimeSum返回区间[m, n]内所有素数的和.题目保证用户传入的参数m≤n. 裁判测试程序样例: #include <st ...

  2. ACMNO.23 C语言-素数判定 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。 输入 一个数 输出 如果是素数输出prime 如果不是输出not prime

    题目描述 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息. 输入 一个数 输出 如果是素数输出prime 如果不是输出not prime 样例输入 97 样例输出 prime 来源/ ...

  3. python判断素数的函数_Python素数prime函数练习_Python源码实操

    Python素数prime函数练习_Python源码实操 素数prime函数练习 1) 写一个函数isprime(x) 判断x是否为素数,如果是素数,返回True,否则返回False def ispr ...

  4. 实验六 调用函数 判断素数

    在编写程序时 对调用函数格式模糊,还是不经常使用的结果, 在复习后,得出 1:所写函数头 要内外表示格式,且在定义函数时要在结束时 加":",而在调用时则不用. 2:所定义的函数返 ...

  5. matlab 判断整除函数_判断素数函数

    描述 写一个函数isPrime(n)用于判断一个数字n是不是素数,用户输入一个正整数,在一行内输出不大于该数的所有素数,各数后面用一个空格分隔. 输入格式 输入一个正整数 输出格式 不大于该数的所有素 ...

  6. python判断素数的函数_使用Python判断质数(素数)的简单方法讲解

    质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念 ...

  7. C语言基础课 编写程序之1.编写一个判断素数的函数,并利用该函数输出100~200的所有素数2.编写一个函数fun(),函数功能是:判断一个整数是否既是5又是7的整倍数,若是,输出yes,不是,输出n

    1.编写一个判断素数的函数,并利用该函数输出100~200的所有素数 #include<stdio.h> #include<math.h> int fun(int n) {in ...

  8. Problem A: 判断是否是素数

    Problem A: 判断是否是素数 分析 是否为一个素数即质数,最直接的方法就是遍历法,对于是否为素数则只需要到这个数本身的平方根即可. 本题的关键在于只要有一个1和它本身的数可以被其整除就判断了是 ...

  9. 写一个判断素数的函数(isprime),在主函数输入一个正整数,输出是否是素数的信息。提示:int main(){int x=23; if (isprime(x)) print

    写一个判断素数的函数(isprime),在主函数输入一个正整数,输出是否是素数的信息. 提示: int main() {int x=23; if (isprime(x)) printf("i ...

最新文章

  1. Extjs Ext.TreePanel
  2. Linux unshare命名的一些例子
  3. 联想小新300加固态_就联想小新 Pro 13 固态硬盘混用一事,官方回应
  4. Java中数组的初始化
  5. 【Kafka】kafka NotLeaderForPartitionException thisserver is not the leader for topic-partition
  6. [转]《精通css》笔记1:css选择器与优先级
  7. linux用户修改密码
  8. 强烈推荐代码生成器Cursor
  9. imperva代理拦截
  10. uniapp手机端图片缓存方案
  11. 扫黑除恶Team第四次团队作业
  12. 盘点那些你不知道的开源软件
  13. 寻找子树和子孙树 ,家谱树
  14. 【Django】Django配置文件和设计模式详解
  15. 一文读懂,WMS仓储管理系统与ERP有什么区别
  16. 在Acer TravelMate 3280 上安装Mac OS Snow Leopard (10.6.7)
  17. selenium详细介绍
  18. 工业超高频读写器|读取器CK-UR12-E02使用POE交换机和博途软件如何与西门子PLC配置解决方案
  19. 【raspberrypi】retropie街机模拟器
  20. App微信登录与公众号微信登录的unionid不一致

热门文章

  1. Java的oauth2.0 服务端与客户端的实现
  2. java.lang.IllegalArgumentException: parameter must be a descendant of this view
  3. 条款2. 最好使用C++转型操作符
  4. Android JNI programming demo with Eclipse
  5. Visual studio 2010 中文版安装Siverlight 5 beta tools 总结
  6. Android高效加载大图、多图解决方案,有效避免程序内存溢出现象
  7. win7 64位 内核安全_Win7进入死亡倒计时,全国一半电脑要遭殃?
  8. python爬虫利器p_Python:网络爬虫相当利器
  9. no module named ‘cv2’解决办法
  10. 查找数组中重复数字 (二)