Python快速入门(七)语法进阶:引用、局部&全局变量、函数返回多个值、缺省参数、多值参数、递归函数
前言:主要介绍Pythong的引用、局部变量、全局变量、函数return多个值、修改函数的参数、函数的缺省参数、函数的多值参数、元组和字典的拆包、递归函数等。
1.引用(指针)
- 定义一个数字变量,然后查看它的指针(注意:数据的地址本质上就是一个数字)。
代码:
a = 10
print("a = %d 变量保存数据的内存地址是 %d" % (a,id(a)))
输出:
- 函数的引用:调用 test 函数,本质上传递的是实参保存数据的引用,而不是实参保存的数据(注意:如果函数有返回值,没有定义变量接收,程序不会报错,但是无法获得返回结果)。
代码:
def test(num):
print("在函数内部num = %d 对应的内存地址是 %d" % (num, id(num)))
result = "hello"
print("函数要返回数据的内存地址是 %d" % id(result))
return result
a = 10
print("a = %d 变量保存数据的内存地址是 %d" % (a,id(a)))
r = test(a)
print("%s 的内存地址是 %d" % (r, id(r)))
输出:
2.局部变量
只能再函数的局部中使用,函数执行,则变量才会被创建,函数结束则变量结束(注意:在函数内部声明的变量,在其他函数中则不能被使用)
代码:
def demo1():
a = 100
print("demo1中的a = %d" % a)
def demo2():
a = 1
print("demo2中的a = %d" % a)
pass
demo1()
demo2()
注意:pass是空语句,是为了保持程序结构的完整性,不做任何事情,一般用做占位语句。
输出:
3.全局变量
在全局声明的变量,可以在各个函数中进行使用。
代码:
a = 520
def demo1():
print("demo1中的a = %d" % a)
def demo2():
print("demo2中的a = %d" % a)
demo1()
demo2()
输出:
4.修改全局变量
1)直接修改全局变量
代码:
a = 520
print("a = %d 变量保存数据的内存地址是 %d" % (a,id(a)))
def demo1():
# 希望修改全局变量的值
# 在 python 中,是不允许直接修改全局变量的值
# 如果使用赋值语句,会在函数内部,定义一个局部变量
a = 52
print("demo1中a = %d 变量保存数据的内存地址是 %d" % (a, id(a)))
def demo2():
print("demo2中a = %d 变量保存数据的内存地址是 %d" % (a, id(a)))
demo1()
demo2()
输出:
观察a = 520和demo2中的a = 520变量中保存的内存地址是一样的,demo1中的a=52是不一样的。在 python 中,是不允许直接修改全局变量的值。(有兴趣的童鞋可以对比一下Java中的全局变量)
2)使用 global修改全局变量
修改全局变量的值,使用 global 声明一下变量即可,global 关键字会告诉解释器后面的变量是一个全局变量,再使用赋值语句时,就不会创建局部变量。
代码:
a = 10
print("a = %d 变量保存数据的内存地址是 %d" % (a,id(a)))
def demo1():
global a
a = 99
print("在demo1中使用global修改a = %d 变量保存数据的内存地址是 %d" % (a, id(a)))
def demo2():
print("在demo2中a = %d 变量保存数据的内存地址是 %d" % (a, id(a)))
demo1()
demo2()
print("最后执行的a = %d 变量保存数据的内存地址是 %d" % (a,id(a)))
输出:
5.全局变量位置&命名规范
- 注意1:我么在使用全局变量的时候,应该把所有全局变量,定义在所有函数上方,就可以保证所有的函数,都能够正常的访问到每一个全局变量了,以免出错。
- 注意2:在定义全局变量的时候,可以以gl_开头。
代码:
gl_num = 520
gl_name = "fly"
def demo():
num = 99
print("%d" % num)
print("%s" % gl_name)
demo()
6.函数return多个值
在Java中只能返回一个数据类型,在Python中我们可以利用元组进行返回多个值。
代码:
def info():
name = "fly"
age = 20
return name, age
# 元组
result = info()
print(result)
print(result[0])
print(result[1])
# 注意:使用多个变量接收结果时,变量的个数应该和元组中元素的个数保持一致
gl_name, gl_age = info()
print(gl_name)
print(gl_age)
输出:
7.交换数字a和b
在其他编程语言中我们交换数字a和b的时候,常常借助中间值,或者进行简单的运算才行。
比如:
# 交换a和b:-使用其他变量
c = a
a = b
b = c
# 交换a和b:-不使用其他的变量
a = a + b
b = a - b
a = a - b
但是在Python中我们可以利用元组的方法进行交换。
代码:
a = 200
b = 100
a, b = (b, a)
print(a)
print(b)
i = 10
j = 20
# 提示:等号右边是一个元组,只是把小括号省略了
i, j = j, i
print(i)
print(j)
输出:
8.不可变和可变的参数
在函数内部,针对参数使用赋值语句,不会修改到外部的实参变量。
代码:
def demo(a, a_list):
print("函数内部的代码")
print(a)
print(a_list)
a = 100
a_list = [1, 2, 3]
print("重新赋值的a",a)
print("重新赋值的a_list",a_list)
gl_a = 99
gl_list = [4, 5, 6]
demo(gl_a, gl_list)
print(gl_a)
print(gl_list)
输出:
9.函数内部通过append方法修改可变参数
可以使用append方法,修改函数内部的可变参数。
代码:
def demo(num_list):
print("函数内部的代码")
num_list.append(100)
print("修改后的num_list",num_list)
gl_list = [1, 2, 3]
print(gl_list)
demo(gl_list)
print(gl_list)
输出:
10.列表相加
- 注意1:列表变量使用 + 不会做相加再赋值的操作,比如:num_list = num_list + num_list。
- 注意2:num_list += num_list相等于num_list.extend(num_list),实质上是调用列表的 extend 方法
代码:
def demo(num, num_list):
print("函数开始")
# num = num + num
# 列表变量使用 + 不会做相加再赋值的操作 !
# num_list = num_list + num_list
# print(num)
# print(num_list)
num += num
# 本质上是在调用列表的 extend 方法
# num_list.extend(num_list)
num_list += num_list
print(num)
print(num_list)
gl_num = 100
gl_list = [1, 2, 3]
print(gl_num)
print(gl_list)
print("*"*100)
demo(gl_num, gl_list)
print("*"*100)
print(gl_num)
print(gl_list)
输出:
11.函数的缺省参数&自定义缺省参数
1.通过列表排序的代码看一下缺省参数使用:
gl_list01 = [11, 23, 9]
# 默认按照升序排序
gl_list01.sort()
print(gl_list01)
gl_list02 = [11, 23, 9]
# 如果需要降序排序,需要执行reverse参数
gl_list02.sort(reverse=True)
print(gl_list02)
输出:
2.自定义缺省参数(注意:在指定缺省参数的默认值时,应该使用最常见的值作为默认值):
def info(name, gender=True):
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s 是 %s" % (name, gender_text))
info("小明")
info("老王")
info("小美", False)
输出:
3.自定义缺省参数的注意点:
def print_info(name, title="", gender=True):
gender_text = "男生"
if not gender:
gender_text = "女生"
print("[%s]%s 是 %s" % (title, name, gender_text))
print_info("小明","班长")
print_info("老王","班主任")
print_info("小美", gender=False)
输出:
12.函数的多值参数
代码1:
def demo(num, *nums, **person):
print(num)
print(nums)
print(person)
demo(1, 2, 3, 4, 5, name="fly", age=18)
输出:
代码2:
def sum_numbers(*args):
num = 0
print(args)
# 循环遍历
for n in args:
num += n
return num
result = sum_numbers(1, 2, 3, 4, 5)
print(result)
输出:
13.元组和字典的拆包
- 注意1:元组的形式 (x,x,x,x)
- 注意2:字典的形式{key: value, key, value}
代码:
def demo(*args, **kwargs):
print(args)
print(kwargs)
# 元组变量/字典变量
gl_nums = (1, 2, 3)
gl_dict = {"name": "fly", "age": 18}
# 拆包语法,简化元组变量/字典变量的传递
demo(*gl_nums, **gl_dict)
demo(1, 2, 3, name="fly", age=18)
输出:
14.递归函数
1.特点:
def sum_number(num):
print(num)
# 递归的出口,当参数满足某个条件时,不再执行函数
if num == 1:
return
# 自己调用自己
sum_number(num - 1)
sum_number(3)
输出:
2.求和:
def sum_numbers(num):
if num == 1:
return 1
temp = sum_numbers(num - 1)
# 两个数字的相加
return num + temp
result = sum_numbers(100)
print(result)
输出:
结束!下一节开始面向对象!!!