今天给大家带来函数的知识分享。
具有名称的能够完成某一特定功能的代码的集合,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
def function_name([args...]):
# 函数体
[return 返回值]
function_name([args…])
比如一个简单的hello world打印
>>>def hello() :
print("Hello World!")
>>> hello()
Hello World!
这里我用参数来进行分类,分为有参,无参,有返回值,无返回值。
|-- 定义有没有参数
|-- 无参函数
|-- 有参函数
函数的参数,要根据实际来决定,是否需要参数
|-- 是否有返回值
|-- 无返回值
|-- 有返回值
在函数中,当遇到return关键字的时候,函数会立刻返回
def show(): #无参
print("hell world")
def show_msg(msg): #有参
print("接收到一个信息--->", msg)
def add(x, y): ##两个参数,有返回值
"""
计算两个数之和
并且将结果返回
"""
res = x + y
return res
# show()
# show_msg("明天是六一儿童节,大家节日快乐,记得给我礼物哦~~~,猥琐!!")
num1 = float(input("第一个值:"))
num2 = float(input("第二个值:"))
sums = add(num1, num2)
print("{} + {} = {}".format(num1, num2, sums))
全局变量:定义在模块(.py)中,可以在该模块定义后任何地方都可以访问
局部变量:定义在函数内部的变量,作用域只是在当前函数内有效,出了函数,无法访问到
在函数中,能不能访问到全局变量?
当然可以,但是注意:在python中,函数内不允许修改全局变量
如果确实在函数内,需要修改全局变量,必须要提前申明
global 全局变量 ##需要修改全局变量可以使用global,尽量不用
# 定义一个全局变量
# num = 1000
# def say(count):
# # 如果确实在函数内,需要修改全局变量,必须要提前申明
# global num
# print("hello,函数开始运行了")
# # my_count 是定义在函数内部的变量,局部变量
# # 局部变量的作用域只在当前的函数内有效
# my_count = 5000
# print(num)
# # 数量加1
# num += 1
# print(num)
# return
# say(10)
# print(num)
name = "old wang"
def change_name():
global name
# name = "old pan"
name += " is good man"
print(name)
change_name()
print(name)
压栈,函数调用本质就是将堆中的函数调用到栈中执行,这个过程被称为压栈,等函数执行完成,会立刻执行出栈(弹栈),执行函数就是将函数调入栈中执行,执行结束再进行弹栈出来。
值传递:本质就是传递数据值的拷贝,跟原先的那个值没有关系
引用传递:本质是传递指针(地址),所以说实质操作的就是堆
也就是值改变与没有改变的关系
def add_user(users):
users.append("不法狂徒")
users.append("张三")
if __name__ == "__main__":
# python的main函数
# 注意:python的中main,主要作用是写在main中的代码
# 并不会被导入其他模块中
# num1 = 10
# num2 = 30
# 值传递
# num1, num2 = change(num1, num2)
# print(num1)
# print(num2)
# ls是一个列表,对象,存在堆中,ls存储的堆中的地址
ls = ["赵大", "钱七", "王五", "李四"]
add_user(ls)
print(ls)
|-- 默认值参数
# 默认值参数,在参数上,给定一个最常用的值,在调用的时候,
# 如果和默认的值一致,就可也不用传递这个参数
def get_cricle_area(r, pi=3.14):
pass
注意:默认值参数,必须放在普通后面!!!
|-- 可变参数
def show(name, age=16, *args):#可写可不写称为可变
pass
args以元组的形式保存
|-- # 命名参数(关键字参数)
def show2(name, age, **kwargs):
pass
kwargs是以字典的形式保存
# 默认值参数,在参数上,给定一个最常用的值,在调用的时候,
# 如果和默认的值一致,就可也不用传递这个参数
def get_cricle_area(r, pi=3.14):
return r * r * pi
# 可变参数
def show(name, age=16, *args):
print(name)
print(age)
print(args)
# 命名参数(关键字参数)
def show2(name, age, **kwargs):
print(name)
print(age)
print(kwargs["address"])
print(kwargs.get("height"))
# 万能参数
def show3(name, age, gender, *args, **kwargs):
pass
if __name__ == '__main__':
# print(get_cricle_area(3, 3.14))
# print(get_cricle_area(3, 3.141592))
# print(get_cricle_area(3, 3.1415926535))
# print(get_cricle_area(3))
# print(get_cricle_area(3, 4))
# show("帅波", 20, "123456", "男")
show2("帅波", 20, gender="男", address="四川泸州", height=1.75)
函数自身调用自身
注意:必须要有终止条件,没有终止条件的递归是一个死循环
超过递归的上限:会抛出异常:StackOverflowException
import sys
# python中规定递归默认不能超过1000次
print(sys.getrecursionlimit())
# 修改递归的默认极限值
sys.setrecursionlimit(10000)
def get_sum(n):
# 递归必须要有终止条件,如果没有终止条件,递归就是一个死循环
# 直到栈溢出为止
if n == 1:
return 1
return n + get_sum(n - 1) ##如用其他语言这样写递归,会报超过数字上限
res = get_sum(100)
print(res)
学会函数可以在下列的这些习题中体会函数的参数传递问题:
这些习题大多在我之前的博客中都有解答。不过现在用函数实现。
1.定义一个函数,传递文件路径,获取文件的后缀名
2:输入一个数字(年份,如2000年),定义函数,判断该年份是否是闰年
3:将之前的打印*组成三角形的代码,改造成函数,要求如下(定义好多函数的):
1、打印的层数有调用者决定
2、如果是菱形的话,判断用户必须输入才层数为奇数才行
4:定义一个函数,判断该数是不是质数
5:做一个计算器函数,输入三个参数(两个数字,一个符号)。
如输入:5 6 + ,则输出: 5+6=11
6:定义函数,打印九九乘法表
7:使用函数完成一个0~n之间的奇数的积。
8:使用递归完成1~100之间的积
9:找出10000以内能被5或6整除,但不能被两者同时整除的数(函数)
10:使用函数求三角形的面积和周长(已知三边的情况下,提示:海伦公式)
import math
math.sqrt(数据) # 表示开平方根
math.sqrt(4) #
是不是完成了上面的十道题都觉得函数十分的简单呢?
可以再试着对下面的题目进行练习。
1、写一个方法,在方法内依次打印出列表每个元素
的值。
2、写一个方法,计算列表所有元素的和(注意返回值
)。
3、写一个方法,计算列表所有奇数下标元素的和(注
意返回值)。
4、写一个方法,计算列表所有偶数下标元素的和(注
意返回值)。
5、写一个方法可以计算两个数的和,想想这个方法
有哪些参数,返回值。
6、写一个方法可以计算两个数的商(分母不能为0),
想想这个方法有哪些参数,返回值是什么。
7、写一个方法将传入的天、小时、分钟、秒的总和
转换为秒,比如0天、2小时、5分、7秒,他们代表的
总秒数为2*3600+5*60+7=7507秒。想想这个方法
有哪些参数,返回值是什么类型。
8、写一个方法交换整型列表中两个指定下标元素的
值。想想这个方法有哪些参数,返回值是什么类型。
9、写一个方法计算整型列表中所有能被3整除元素的
个数。想想这个方法有哪些参数,返回值是什么类
型。
10、写一个方法将整型数字(int)转换为格式化的字符
串(string),现要求如下:
a.可以指定转换后[字符串的长度];
b.当数字的长度不足指定的长度,让这个字符串右对
齐,指定[左边补的字符(char)];
例如,假设现在将指定的数字转换为固定长度为8的
字符串,如果长度不足,左边补'0',那么27这个数字
就会转换为字符串"00000027"。
根据要求,想想这个方法有哪些参数,返回值是什么
类型。
11.用方法实现找出一个int类型列表中最大值和最小
值
12.判断一个数是否是质数(素数)?该如何声明方
法?
13. 将指定的秒数转变为几小时几分几秒。
14.使用Random类给一个数组的所有元素赋随机初值
(不重复)。
15.判断一个整型数组是否是对称的。所谓对称就是
第一个元素等于最后一个元素,第二个元素等于倒数
第二个元素,依次类推,例如【7,3,1,3,7】就
是对称的。
16.打印一个元组的所有值。
17.查找一个元组中某个值是否存在,如果存在返回
这个值的索引,否则返回-1。
18.将一个列表反转过来,比如【2,3,1,4,7】转
换为【7,4,1,3,2】
19.求一个列表的最大值。
20.求一个列表的最小值。
21.写一个方法,实现在列表中指定的的位置前插入
一个值。
22.写一个方法,删除列表中指定位置的元素。
23.猜数游戏
1.随机出现一个数(范围自定义) 作为答案
2.提示用户输入并根据答案和用户输入的大小关系输
出大了? 小了?
3.5次机会
4.可以重复玩
5.根据猜对的次数进行评价
6.无论对错 请告知答案
上述的习题我都提供了拙劣的代码示例,仅供列位参考。习题参考