python学习笔记4 --Python函数

📅 2026/8/26 18:39:10
python学习笔记4 --Python函数
第6章 Python函数6.1 函数的概念《街霸》游戏中,每次人物出拳、出脚或跳跃等动作都需要编写50-80行的代码,在每次出拳、出脚或跳跃的地方都需要重复地编写这50-80行代码,这样程序会变得很臃肿,可读性也非常差。为了解决代码重复编写的问题,可以将出拳、出脚或跳跃的代码提取出来放在一个{}中,并为这段代码起个名字,这样在每次的出拳、出脚或跳跃的地方通过这个名字来调用这个{}的代码就可以了。上述过程中,所提取出来的代码可以被看作是程序中定义的一个函数,程序在需要出拳、出脚或跳跃时调用该函数即可。函数(function)是 Python 中用于封装可重复执行代码块的基本单元,它能够接收输入参数、执行特定逻辑,并可选择性地返回结果。简单的说:函数代表一个独立的可复用的功能。通过使用函数,程序编写、阅读、测试和修复起来都更加容易。Python中的函数必须先定义后使用,Python提供了许多内建函数,比如print()。也可以自己创建函数,这被叫做用户自定义函数。6.2 函数的定义6.2.1 函数的定义格式Python 定义函数使用 def 关键字,一般格式如下:def函数名(参数列表):函数体return[表达式]格式:函数代码块以def关键词开头,后接函数标识符名称和圆括号 (),()后面以冒号结束。函数体开始缩进。函数名:函数名是程序员给这个函数起的名称,需要遵循标识符的命名规则。函数名一般是一个动词,第一个单词小写,其他每个单词的首字母大写,即小驼峰命名法。参数列表:函数在完成某个功能时,可能需要一些数据,在定义函数时指定函数参数来接收这些数据。例如在屏幕上打印信息,需要把要打印的信息传递给print()函数。如果有多个参数,参数之间使用逗号分隔。函数也可以没有参数,但是小括弧不能省略。函数体:函数体一般包含3个部分:文档说明,功能代码,return [表达式]语句。函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。用三个引号括起来,单引号和双引号都可以。return [表达式] 结束函数,返回一个值给调用方。不带表达式的return或没有return语句相当于返回 None。6.2.2 函数的定义和调用函数必须先定义再调用;函数定义后不调用是不会执行的;调用一次执行一次;# -----------------------函数的演示----------------------------# 定义函数defprint_hello():""" 打印hello world """print("hello world")# 调用函数。先定义,再调用。print_hello()print("--------")print_hello()print()# -----------------------# 定义函数,并接收参数defprint_star(line,column):""" 打印指定行数和列数的星号 """foriinrange(line):forjinrange(column):print("*",end=" ")print()# 调用函数print_star(5,10)print()# -----------------------# 定义函数,并返回结果defadd(a,b):""" 返回两个数的和 """returna+b# 调用函数print("add(1, 2) = ",add(1,2))print("add(2, 3) = ",add(2,3))6.2.3 函数的好处使程序变得更简短而清晰可以提高程序开发的效率提高了代码的重用性有利于程序维护6.3 函数的说明文档函数说明文档的好处提高代码可读性清晰描述函数的功能和用途帮助其他开发者快速理解函数的作用便于维护和调试提供函数的详细说明,方便后续修改减少因误解函数功能而产生的错误自动生成文档Python可以通过 help() 函数查看文档字符串支持自动化工具生成API文档提升开发效率团队协作时,文档能减少沟通成本IDE可以显示文档提示,提高编码效率# =================函数说明文档的演示========================# 定义一个函数,可以判断一个数是否是素数defis_prime(num):""" 判断num是否是素数 :param num: 待判断的整数 :return: 如果是素数返回True,否则返回False """ifnum2:returnFalseimportmathforiinrange(2,int(math.sqrt(num)+1)):# 17ifnum%i==0:returnFalsereturnTrue# 调用函数print("7是素数吗?",is_prime(7))help(is_prime)PyCharm中将鼠标悬停在函数名上方也可以看到函数说明文档。6.4 返回值6.4.1 函数体中没有return语句# =================函数返回值的演示========================# 定义函数,函数体没有return语句,表示没有返回值defprint_hello():""" 打印 hello """print("hello")# 调用函数print_hello()# print_hello函数没有返回值,所以不用接收返回值# 在Python中函数没有返回值,也可以打印它的结果,但结果是Noneprint("结果:",print_hello())# print_hello函数没有返回值,所以结果是Noneresult=print_hello()# 在Python中函数没有返回值,也可以用变量接收返回值,但结果是Noneprint("result=",result)6.4.2 函数体有return语句# 定义函数,函数体有return语句,但return后面没有值,表示没有返回值defprint_star(line,column):""" 打印指定行数和列数的星号 """ifline=0orcolumn=0:return# 作用是提前结束函数的执行foriinrange(line):forjinrange(column):print("*",end=" ")print()# 调用函数print_star(-5,10)# print_star函数没有返回值,所以不用接收返回值print("结果是",print_star(1,5))# 结果是Noneresult=print_star(0,10)# 结果是Noneprint("result=",result)6.4.3 函数体有return 值语句# 定义函数defadd(a,b):""" 返回两个数的和 """returna+b# 返回结果# 调用函数add(1,2)# add函数有返回值,不接收返回值也是可以的,返回值就丢失了。因为add函数中没有打印语句,看起来像没有执行一样print("add(1, 2) = ",add(1,2))# 直接输出返回值result=add(1,2)# 可以用变量接收返回值print("result=",result)6.5 参数6.5.1 形参和实参在定义函数时,指定的参数称为形式参数,简称为形参(函数的提供者);-在调用函数时,给函数传递的参数称为实际参数,简称为实参(函数的调用者)在定义函数时,形参没有分配存储空间,也没有值,相当于一个占位符;-在调用函数时, 会在栈区中给函数分配存储空间, 然后给形参/局部变量分配存储空间,传递的是实际的数据。当函数执行结束,函数所占的栈空间会被释放,函数的形参/局部变量也会被释放1.定义一个打印矩形的函数接收两个参数 行,列23打印2行3列矩形*****35打印3行5列的矩形2.定义一个函数 接收一个数 判断是否能被3整除 如果可以 返回 true 否则返回false3.定义一个函数 判断是否为质数 是 返回true 不是返回 false# 1.定义一个打印矩形的函数接收两个参数 行,列# 2 3 打印 2 行3列矩形 *****# 3 5 打印 3行 5列的矩形# def print_star(line,column):# """# 输入正整数,打印对应长宽矩形的*# :param line: 行# :param column: 列# :return: 无返回参数# """# if line=0 or column=0:# print("请输入正整数的长和宽")# return# for i in range(line):# for j in range(column):# print("*",end = " ")# print()## line = int(input("请输入行:"))# column = int(input("请输入列:"))# print_star(line,column)# 2.定义一个函数 接收一个数 判断是否能被3整除 如果可以 返回 true 否则返回false# def is_exactdivision_by3(num):# """# 判断接收的数是否能被3整除# :return: 返回bool# """# if num % 3 == 0:# print("该数可以被3整除")# return True# else:# print("该数不可以被3整除")# return False## num = int(input("请输入一个数字:"))# is_exactdivision_by3(num)# 3.定义一个函数 判断是否为质数 是 返回true 不是返回 falsedefis_prime(num):""" 判断接收的数是否是质数 :return: 返回bool """foriinrange(2,num//2+1):ifnum%i==0:print("该数不是质数")returnFalseprint("该数是质数")returnTruenum=int(input("请输入一个数字:"))is_prime(num)6.5.2 参数传递1、python 中变量没有类型在 python 中,类型属于对象,变量是没有类型的a=10a="helloworld"以上代码中,10是数字类型,"helloworld"是 str 类型,而变量 a 是没有类型,它仅仅是一个对象的引用(一个指针),可以是指向数字类型对象,也可以是指向str 类型对象。2、引用的概念在 Python 中,变量和数据是分开存储的,数据保存在内存中的一个位置,变量中保存着数据在内存中的地址,变量中记录数据的地址,就叫做引用。使用id()函数可以查看变量中保存数据所在的内存地址。注意:当给一个变量重新赋值的时候,本质上是修改了数据的引用,变量不再引用对之前的数据,变量改为对新赋值的数据引用,变量的名字类似于便签纸贴在数据上。a=500print(id(a))a=1000print(id(a))3、可变与不可变类型在Python常见的类型中,数字类型、string、tuple是不可更改的对象,而list、set、dict等则是可以修改的对象。(1)不可变(immutable)类型:所有的修改操作都会产生新对象,即修改引用。s="hello"print("s:",s,",id(s):",id(s))s=s.replace("e","a")print("s:",s,",id(s):",id(s))s+="world"print("s:",s,",id(s):",id(s))(2)可变(mutable)类型:有些操作基于原对象进行修改的,不产生新对象,例如:append、remove、+=、*=等有些操作是会产生新对象的,例如:=、union、difference等list_demo=[1,2]print("list_demo:",list_demo,",id(list_demo):",id(list_demo))list_demo.append(3)print("list_demo:",list_demo,",id(list_demo):",id(list_demo))list_demo+=[4,5]print("list_demo:",list_demo,",id(list_demo):",id(list_demo))list_demo=list_demo+[6,7]print("list_demo:",list_demo,",id(list_demo):",id(list_demo))4、Python的参数传递机制不可变类型:如整数、字符串、元组等类型。效果类似c++,java的值传递。如fun(a),在fun函数中对形参做任何修改,不会影响实参a 本身。因为对形参做任何修改本质上都是形参指向新对象,所以与原来的实参对象无关。可变类型:如列表,字典等类型。效果类似c++的引用传递。如 fun(a),在fun函数中对形参进行修改,分为2种情况:基于形参原对象进行修改,此时实参a也会受影响,因为形参和实参指向同一个对象。修改产生新对象,即给形参重新赋值新对象,此时不会影响实参a。因为新对象与实参对象无关。Python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。不可变类型示例# 实参是不可变类型的对象# 定义函数defchange_str(s):print(f"{s}的id是:{id(s)}")s=s.replace('e