python0基础学习之函数

今天给大家带来函数的知识分享。

1.什么是函数

具有名称的能够完成某一特定功能的代码的集合,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

2、python如何定义函数

函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
def function_name([args...]):
	# 函数体
	[return 返回值]

3、调用函数

function_name([args…])

比如一个简单的hello world打印

>>>def hello() :
   print("Hello World!")
  
>>> hello()
Hello World!

4.函数的分类

这里我用参数来进行分类,分为有参,无参,有返回值,无返回值。

	|-- 定义有没有参数
		|-- 无参函数
		|-- 有参函数
			函数的参数,要根据实际来决定,是否需要参数
	|-- 是否有返回值
		|-- 无返回值
		|-- 有返回值
		在函数中,当遇到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))

5、全局变量和局部变量

全局变量:定义在模块(.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)

6、函数的调用

压栈,函数调用本质就是将堆中的函数调用到栈中执行,这个过程被称为压栈,等函数执行完成,会立刻执行出栈(弹栈),执行函数就是将函数调入栈中执行,执行结束再进行弹栈出来。
在这里插入图片描述

7、引用传递和值传递

值传递:本质就是传递数据值的拷贝,跟原先的那个值没有关系
引用传递:本质是传递指针(地址),所以说实质操作的就是堆
也就是值改变与没有改变的关系
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)

8、函数的参数问题

|-- 默认值参数
	# 默认值参数,在参数上,给定一个最常用的值,在调用的时候,
	# 如果和默认的值一致,就可也不用传递这个参数
	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)

9、函数递归

函数自身调用自身
注意:必须要有终止条件,没有终止条件的递归是一个死循环

超过递归的上限:会抛出异常: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.无论对错 请告知答案

上述的习题我都提供了拙劣的代码示例,仅供列位参考。习题参考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章