1.函数基本使用
1.定义函数
def print_hello():
print('hello')
2.调用函数:通过函数名来调用
print_hello()
输出结果:
2.函数的嵌套
def hello():
print('hello')
def python():
print('python')
hello()
此函数的输出结果是hello,则pytho()子函数没有执行
def hello():
print('hello')
def python():
print('python')
# 在函数中定义的子函数,必须在函数中进行调用.
python()
hello()
输出结果为:
hello
pyhton
3.参数
python中一切皆对象,函数中传递的是对象的引用
1.形参/实参:
# 在定义函数时需要的变量.称为形参(形参名任意)
def hello(a):
print('hello', a)
# 在调用函数时传递的参数称为实参
hello('python')
输出结果:
hello pyhton
4.形参详细说明
形参的类型有:位置参数, 默认参数,可变参数, 关键字参数
1.位置参数: 即形参和实参的位置一 一对应
def info(name, age):
print('Name:', name)
print('age:', age)
# 调用
info('hello', 18)
输出结果为:
Name: hello
age: 18
# 调用
info(18, 'hello')
输出结果为:
Name: 18
age: hello
# 调用
info(name='python', age=19)
输出结果为:
Name: python
age: 19
2.默认参数: 当无实参传递时,则使用默认参数;当有参数传递时,则使用实参
def my_pow(x, y=2):
print(x ** y)
my_pow(2)
输出结果为: 4
my_pow(2, 5)
输出结果为:32
3.可变参数:可以接受多个参数传递
# args是一个新的引用(类似一个数组指针,指向一个指针数组,指针数组中存贮的指针指向原实参中的元素)
def my_sum(*args):
print(*args)
print(args)
sum = 0
for item in args:
sum += item
print(sum)
my_sum(1,2,3,4,5,6,7,8,9)
输出结果如下:
1 2 3 4 5 6 7 8 9
(1, 2, 3, 4, 5, 6, 7, 8, 9)
45
当实参如下时:
num_1 = [1,2,3]
num_2 = {4,5,6}
num_3 = (7,8,9)
# my_sum(num_1/) 不能直接调用
my_sum(*num_1)
my_sum(*num_2)
my_sum(*num_3)
输出结果如下:
1 2 3
(1, 2, 3)
6
4 5 6
(4, 5, 6)
15
7 8 9
(7, 8, 9)
24
4.关键字参数: 可以接受一个字典
def getinfo(name,age,**b):
print('Name:',name)
print('Age:',age)
print('b:',b)
d=dict(a=1,b=2)
getinfo('python',18,**d)
输出结果如下:
Name: python
Age: 18
b: {'a': 1, 'b': 2}
# 调用
getinfo('tom',19,hobbies=['code','running'],gender='female')
输出结果如下:
Name: tom
Age: 19
b: {'hobbies': ['code', 'running'], 'gender': 'female'}
补充:
调用函数时使用* & **
test(*args)中:
* 的作用其实就是把序列 args 中的每个元素,当作位置参数传进去;
例如:如果 args 等于 (1,2,3) ,那么这个代码就等价于 test(1, 2, 3).
test(**kwargs)
** 的作用则是把字典 kwargs 变成关键字参数传递;
例如:如果 kwargs 等于 {'a':1,'b':2,'c':3} ,那这个代码就等价于 test(a=1,b=2,c=3).
定义函数参数时使用* & **
def test(*args):
*args 表示把传进来的位置参数都装在元组 args 里面;
例如:调用 test(1, 2, 3) 的话, args 的值就是 (1, 2, 3).
def test(**kwargs):
**args 表示把传进来的位置参数都装在元组 args 里面;
调用 test(a=1,b=2,c=3) 的话, kwargs 的值就是 {'a':1,'b':2,'c':3}.
5.函数的返回值
返回值:
return用来返回函数执行的结果 如果函数没有返回值 默认返回None
函数一旦遇到return 函数执行结束 后面的代码不会执行
具有多个返回值的时python会将结果封装成一个元组返回
def my_fun(x, y=2):
return x**y,x+y
print(my_fun(2),type(my_fun(2)))
输出结果: (4, 4) <class ‘tuple’>
6.作用域
局部变量:在函数内部定义的变量,只在函数内部起作用,函数执行结束后,变量会自动删除
全局变量:在整个函数中都起作用
局部变量:
def fun_test():
num=10
print('inside:', num)
num = 20
print('outside:',num)
fun_test()
print('outside_after_fun:',num)
输出结果:
outside: 20
inside: 10
outside_after_fun: 20
全局变量:
def fun_test():
global num
num = 10
print('inside:', num)
num = 20
print('outside:',num)
fun_test()
print('outside_after_fun:',num)
输出结果:
outside: 20
inside: 10
outside_after_fun: 10
练习:
编写函数, 接收一个列表(包含15个整形数)和一个整形数k, 返回一个新列表.
函数需求:
- 将列表下标k之前对应(不包含k)的元素逆序;
- 将下标k及之后的元素逆序;
def my_reverse(nums,k):
nums_len = len(nums)
nums_first = []
nums_second = []
for i in range(k):
nums_first.append(nums[k-i-1])
for i in range(1, (nums_len-k)+1):
nums_second.append(nums[-i])
nums_res = []
for i in nums_first:
nums_res.append(i)
for i in nums_second:
nums_res.append(i)
return nums_res
import random
nums_li = []
for i in range(15):
nums_li.append(random.randint(10,50))
k = int(input('Please input index k:'))
print(nums_li)
result = my_reverse(nums=nums_li, k=k)
print(result)
输出结果如下: