1.引用
def test(num):
print("在函数内部%d对应的数据地址是%d"%(num,id(num)))
# 定义一个字符串变量
result = "山口一男"
print("函数要返回的内存地址是%s"%id(result))
# 返回的是数据的引用,而不是数据本身
return result
# 1. 定义一个数字的变量
a = 10
# 数据的地址本质就是个数字
print("a 变量保存的数据地址是%d"%id(a))
# 2. 调用test函数
test(a)
首先,def定义个test的函数,然后再里面加了个num的形参,然后再在函数内部,进行填写代码。首先用pring,进行弹出num和num的id地址,这个id就是查询数据的地址,数据地址本质都是数字。然后再后面定义了个result的函数,,继续print输出result函数,以及它这个函数的地址,在下面在进行return进行返回这个result的值。然后再在下面定义了个a的函数,然后print输出a的变量数据地址。
在用函数test实参内输入a,也就是把a的值赋值到num里面,然后进行输出。
2.局部变量
def demo1():
# 定义一个局部变量
num = 10
print("在demo1函数内部变量是%d"%num)
def demo2():
num = 99
print("在demo1函数内部变量是%d"%num)
demo1()
demo2()
首先局部变量和全局变量的区别是局部变量是在函数内部进行定义的变量值,就被称之为“局部变量”,全局变量顾名思义,就在是外面定义的一个大的变量。不同def函数定义的变量,他们互相都不会影响的。比如上面我定义个num赋值10,下面赋值99.
不代表说他们的值都是一样,他们的值互相都不会被影响的。
局部变量就是在函数内部定义的变量!!!!!!
3.全局变量
# 全局变量
num = 10
def demo1():
print("demo1 == %d"%num)
def demo2():
print("demo2 >=%d"%num)
demo1()
demo2()
# The author : 山口一男
全局变量刚才说过了,在这里在说一次,全局变量就是在全局中定义的变量,也就是在局外定义的变量,不是在def函数内部定义的变量就行啦!而且全局变量在函数内部都是可以进行调用的,可以看下图实例哦!
不过一般要是局部变量和全局变量名字一样的时候,尽量在全局变量前面加上gl,这样命名就可以让别人感觉到你很专业。
拓展
# 全局变量
num = 10
def demo1():
# 希望修改全局变量的值
# 在python中 是不允许直接修改全局变量的值
# 如果使用赋值语句,在函数内部重新定义一个局部变量
num = 99
print("demo1 == %d"%num)
def demo2():
print("demo2 >=%d"%num)
demo1()
demo2()
# 作者 :山口一男
当我们遇到一个需求的时候。比如在函数内部,进行调用全局变量,且全局变量的值,不是我们想要的,这个时候我们是不能直接修改全局变量的值的,所以我们只能在函数内部,进行重新赋值,也就是定义个新的函数,例如:我这里重新定义了num=99
基本上大致的内容就是如图了,修改全局变量的话,是不能直接修改的,只能在函数内部进行重新赋值,各位切记哦!!!
5.修改并声明全局变量
# 全局变量
num = 10
def demo1():
# 希望修改全局变量的值 - 可以使用globat 声明一项变量即可
# globat会告诉python解释器 后面的变量是一个全局变量
# 再使用赋值语句,就不会创建局部变量
global num
num = "山口一男"
print("demo1 == %s"%num)
def demo2():
print("demo2 >=%s"%num)
demo1()
demo2()
# 作者:山口一男
首先定义了一个num的全局变量,然后让他们进行调用。当num在函数内部调用的时候,这个时候基本上num的值是无法修改的,或者可以重新赋值。当然还有一种方法,这种方法就是global,也就是把这个函数后面那个变量声明成一个全局变量。
在global是声明全局变量的函数,然后在后面加上那个要修改的全局变量,就可以修改了,这样就不用重新创建新的赋值语句了,一般全局变量的名字最好加个“gl”,不然的话,全局变量和局部变量的名字冲撞了,可就不好玩了。
6.全局变量的位置
# 注意 在开发中必须把模块中的全局变量 定义在函数的上方
# 定义在函数上方,就可以保证调用函数
# 都能正常访问到每一个全局变量了
num = 10
age = '18'
name = "山口一男"
def ldd():
print(num)
print(age)
print(name)
# age = '18'
# name = "山口一男"
ldd()
# 作者:山口一男
全局变量在上面已经介绍两次辣,这里就不在介绍了。全局变量的位置,可千万不要搞错,不然的话会出现代码错误的哦!
而且Python是门解释编程语言,都是从上往下进行执行的,所以全局变量最好是在调用函数的上面,这样就不会报错了,也可以保障函数的调用,如果把全局变量定义在函数的下方,这样程序会严重报错的!!所以一切要切记!!!
7.全局变量的命名
# 注意 在开发中必须把模块中的全局变量 定义在函数的上方
# 定义在函数上方,就可以保证调用函数
# 都能正常访问到每一个全局变量了
# 定义全局变量 最好在前面加上一个gl_ 这样会被看起来 很有经验
gl_num = 10
gl_age = '18'
gl_name = "山口一男"
def ldd():
# 如果局部变量和全局变量的名字一样
# pycharm会在局部变量下面出现一条灰色的虚线
num = "99"
print(num)
print(gl_num)
print(gl_age)
print(gl_name)
ldd()
# 作者:山口一男
命名在上面也大概说了两次,下面就在这里好好的讲解下,局部变量和全局变量的主要区别,也就是一个在函数内,一个在函数外,如果假设全局变量和局部变量的名字都一样,会怎样呢。当然系统不会报错,但是会在函数下面出现一条灰色的线,提示你,和全局变量的名字一样。所以在命名的时候,尽量还是要全局变量的名字前面加上个gl,这样就会显得你代码很成熟!
8.多个返回值
def measure():
"""测量温度和湿度"""
print("测量开始...")
temp = 39
wetness = 50
print("测量结束...")
# 元祖
# 如果函数返回的类型是元祖 可以省略小括号
# return (temp,wetness)
return temp,wetness
result = measure()
print(result)
print(result[0])
print(result[1])
# 如果函数的类型返回的值是元祖类型,同时希望批量处理元祖内的元素
# 可以使用多个变量 一次接收函数的返回结果
# 注意: 使用多个变量来接收结果时,变量的个数应该和元祖列表的个数保持一致
gl_temp,gl_wetness = measure()
print(gl_temp)
print(gl_wetness)
# 作者:山口一男
当遇到函数内部,多个return返回值的时候,这个时候就可以用元祖的方法,调用索引,比如在result后面加了个中括号来查询索引位置的值,或者直接定义个函数,来接受元祖的内容,但是变量的个数要和元祖列表的个数保持一致,不然的话,容易报错。
而且最重要的是 如果函数返回的类型的元祖的话,这个时候外面的小括号就可以直接省去了,直接再后面点一下就行了。
9.交换数字
a = 6
b = 100
# 解法:1
"""c = a
a = b
b = c
print(a)
print(b)"""
# 解法:2
"""a = a+b
b = a-b
a = a-b
print(a)
print(b)"""
# 解法:3
a,b = b,a #等号右边是一个元祖 只是把括号省略了
print(a)
print(b)
# 作者 :山口一男
首先定义两个函数,用来记录函数的数字。但是如何转换呢。
方法1 定义个c的函数,用c来接受a的值,然后用a接受b的值,再用b接受c的值。然后弹出等于 a=100,b=6;
方法2 用a来记录a+b的值,然后b=a-b也就是106-6,此时b已经=6了,所以a=a-b也就是106-6,不过逻辑性比较麻烦。
方法3 用元祖来互换ab的值,直接a,b=b,a,然后a=100,b=6了。 第一个方法比较容易理解,第二个比较逻辑性,第三个比较简单。听说是面试题,大家速撸哦~
10.可变不可变参数
def demo(num,num_list):
print("函数内部的代码")
# 在函数内部针对参数使用赋值语句,不会修改到外部的实参变量
num = 100
num_list = [1,2,3]
print(num)
print(num_list)
print("函数执行完成")
gl_num = 99
gl_list = [4,5,6]
demo(gl_num,gl_list)
print(gl_num)
print(gl_list)
# 作者:山口一男
当我们在函数内部,进行修改函数赋值语句的话,不会修改外部的实参变量,因为赋值语句只会在函数内部进行调用,而不会影响到外面的实参,比如gl_num,gl_list.
11.通过函数内部进行修改可变参数
def demo(num_list):
print("函数内部的代码")
# 使用方法修改列表的内容
# 在函数内部调用方法没有智能提示 需要手动
num_list.append(9)
num_list.pop(2)
print(num_list)
print("函数执行完成")
gl_list = [1,2,3]
demo(gl_list)
print(gl_list)
首先在函数后面增加个形参,然后print弹出内部代码,执行完成什么的~然后外部定义个列表的实参。实参的值为1,2,3.
然后在函数内部进行调用形参,可以用列表的方法进行修改实参的值,不过这里是没有智能提示的。只能靠自己手动进行输入命令。在这里我用append进行增加了一个值,又用pop删除了一个值。来看下代码执行效果。
12.加等于
def demo(num,num_list):
print("函数开始")
# num + num = num num = num + num
num += num
""" num_list = num_list + num_list
# 列表变量使用 +=不会做相加再赋值的操作!!!
# 本质上都是在调用列表的extend的方法"""
# num_list += num_list
num_list.extend(num_list)
print(num)
print(num_list)
print("函数完成")
gl_num = 9
gl_num_list = [1,2,3]
demo(gl_num,gl_num_list)
print(gl_num)
print(gl_num_list)
首先定义两个形参,一个函数形参和一个列表形参,然后在函数内部给这个函数形参进行+=赋值。至于列表的话是不可以用+=赋值的。列表的话只能用append进行添加。在外面定义的一个全局变量,和全局列表。变量的值是不会被修改的,而变量的列表则会被修改哇!!!!
13.函数的缺省参数
gl_list = [6,3,9]
# 默认按照升序进行排序 -正常的顺序可能比较多
# gl_list.sort() 默认是顺序
gl_list.sort(reverse=True) #按照降序排序
print(gl_list)
列表的使用方法 不懂列表的可以点击进行查看。一般函数的列表用sort进行排序,一般都是顺序,逆序的话则需要在里面加个reverse然后=True就可以辽。这样的话就是逆序了。
14.函数缺省的参数定义
# 这里设置True就可以直接输入名字就行了
def print_info(name,gender=True):
"""
:param name: 班上同学的姓名
:param gender: True表示男生 False表示女生
"""
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s是%s"%(name,gender_text))
# 假设班上的男生比较多
# 提示: 在指定缺省参数的默认值时,应该使用最常见的值作为默认值
print_info("小明")
print_info("老王")
print_info("小美",False)
print_info("山口一男")
首先呀,定义个函数,然后在函数内部输入两个形参,在函数内部,定义个新的函数,genter_text然后把他的默认="男生",然后用if not。这里说下not的用法,当初始值为True的时候,就执行False的值,当为False的时候就执行True的值。
然后当genter的值等于Flase的时候,就判断是女生。然后用print进行弹出输出。这里可以直接在运行的页面进行查看。
15.缺省参数的注意点
# 这里设置True就可以直接输入名字就行了
def print_info(name,title=["学生"], gender=True):
"""
:param title: 职位
:param name: 班上同学的姓名
:param gender: True表示男生 False表示女生
"""
gender_text = "男生"
if not gender:
gender_text = "女生"
print("[%s]%s是%s" % (title,name, gender_text))
# 假设班上的男生比较多
# 提示: 在指定缺省参数的默认值时,应该使用最常见的值作为默认值
print_info("小明","啦啦")
print_info("老王")
print_info("小美", gender=False)
print_info("山口一男")
# 作者 :山口一男
在这里新定义了个函数,title来记录职位。然后当gender默认值=True的时候既可以不添加内容,然后调用函数的时候,可以在函数内部名字的后面添加内容,也可以进行直接调用,但是默认的职位都是同学哦!
16.多值参数
# rrgs是变量意思
# kw是键值对的缩写
# 函数前面一个*是元祖 两个*是字典
def demo(num,*nums,**person):
print(num)
print(nums)
print(person)
# demo(1)
demo(1,2,3,4, name="小明",agge=18)
demo("山口一男",2, 5,6,9, name="啦")
首先来说下多值参数。多值参数就是多个类型不同值的参数。rrgs是变量的意思,kw是键值对的意思,键值对就是字典内部。
在函数形参里面的形参名前面*是元祖,两个的话为字典。如果有三个函数的话,调用函数第一个实参的内容就是第一个形参,然后是元祖,字典。
17.多值参数求和
def sum_numbers(*args):
num = 0
print(args)
# 循环遍历
for n in args:
num +=n
return num
result = sum_numbers(1,2,3,4,5,6,7)
print(result)
首先定义个元祖的形参,然后定义局部变量num=0,然后用print输出ages这个形参,然后用for循环变量,定义一个n新的函数,然后用n来循环这个arges这个元祖形参。然后再使用 num+=n也就是num=n+num,然后再用个return返回num的值,这样就可以多值参数循环求和了。
18.元祖和字典的拆包
def demo(*args,**kwargs):
print(args)
print(kwargs)
# 元祖变量/字典变量
gl_num = (1,2,3)
gl_dict = {"name":"小明",
"age": 18}
demo(*gl_num,**gl_dict)
# 元祖拆包加一个* 字典拆包加两个*
# 拆包语法 可以简化元祖变量/字典变量
元祖拆包加一个* 字典拆包加两个*, 拆包语法 可以简化元祖变量/字典变量。
19.递归参数特点
def sun_numbers(num):
print(num)
# 要有递归的出口,当参数满足某个条件时,不再执行函数
if num == 1:
return
# 递归是函数在函数内部自己调用自己
sun_numbers(num-1)
sun_numbers(3)
递归参数就是函数在函数内部进行调用自己,不过递归要有出口,不然的话程序会报错。
20.递归求和
# 定义一个函数sun_numbers
# 能够接收一个 num的整数参数
# 计算 1+2+3+......
def sun_numbers(num):
# 1.首先考虑出口
if num == 1:
return 1
# 2.数字的累加 num+1+2+3+...num
# 假设sun_numbers 能够正确处理 1...num-1
temp = sun_numbers(num - 1)
# 核心代码 两个数字的相加
return num + temp
result = sun_numbers(100)
print(result)
# 递归是一个编程技巧 可是我是个菜鸟~
首先定义一个函数sun_numbers用来接收加的值,然后定义一个num的形参,计算数字的结果。然后用if进行判断,当num==1的时候,return返回1的值。然后定义个新的值来记录每次减1的函数。sun_numbers,然后再用return进行返回和。之后就可以自己调用函数了。