Python之函数
- 什么是函数
函数是可以实现一些特定功能的小方法或是小程序
函数,就是指为一段实现特定功能的代码“取”一个名字,以后即可通过该名字来执行(调用)该函数。
通常,函数可以接收零个或多个参数,也可以返回零个或多个值。从函数使用者的角度来看,函数就像一个“黑匣子”,程序将零个或多个参数传入这个“黑匣子”,该“黑匣子”经过一番计算即可返回零个或多个值。
定义函数需要注意的几个事项:
1、def开头,代表定义函数
2、def和函数名中间要敲一个空格
3、之后是函数名,这个名字用户自己起的,方便自己使用就好
4、函数名后跟圆括号(),代表定义的是函数,里边可加参数
5、圆括号()后一定要加冒号: 这个很重要,不要忘记了
6、代码块部分,是由语句组成,要有缩进
7、函数要有返回值return
- 定义一个函数
def hello()定义一个函数
通过函数名来调用函数
[kiosk@foundation13 ~]$ vim test.py
[kiosk@foundation13 ~]$ cat test.py
def hello():
print('hello')
print('python')
hello()
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test.py
hello
python
函数中嵌套函数:
[kiosk@foundation13 ~]$ vim test1.py
[kiosk@foundation13 ~]$ cat test1.py
def westos():
print('is westos')
def python():
print('is python')
python()
westos()
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test1.py
is westos
is python
形参:定义函数的时候的变量(形参可以任意起名)
实参:真实的数据信息,调用函数的时候传递的参数
[kiosk@foundation13 ~]$ vim test2.py
[kiosk@foundation13 ~]$ cat test2.py
def welcome(a):
print('hello',a)
welcome('tom')
welcome('lily')
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test2.py
hello tom
hello lily
- 型参的分类
位置参数:型参和实参必须保持一致
[kiosk@foundation13 ~]$ vim test3.py
[kiosk@foundation13 ~]$ cat test3.py
def getInfo(name,age):# 按照位置传参数
print(name,age)
getInfo('westos',11)
getInfo(11,'westos')
getInfo(age=11,name='westos')
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test3.py
westos 11
11 westos
westos 11
默认参数 :
[kiosk@foundation13 ~]$ vim test4.py
[kiosk@foundation13 ~]$ cat test4.py
def mypow(x,y=2):
print(x**y)
mypow(2,3)
mypow(4)
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test4.py
8
16
可变参数 :
参数解包:在参数名前加*
[kiosk@foundation13 ~]$ vim test5.py
[kiosk@foundation13 ~]$ cat test5.py
def mysum(*a):
print(*a)
print(a)
sum = 0
for item in a:
sum += item
print(sum)
nums = [1,2,4,5]
nums1 = (1,2,3,4)
nums2 = {1,2,3,4}
mysum(*nums)
mysum(*nums1)
mysum(*nums2)
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test5.py
1 2 4 5
(1, 2, 4, 5)
12
1 2 3 4
(1, 2, 3, 4)
10
1 2 3 4
(1, 2, 3, 4)
10
关键字参数:
*k:是一个字典,可以传递任意多的key-value
如果要对字典进行解包,一个星号,获取所有的key值
kiosk@foundation13 ~]$ vim test6.py
[kiosk@foundation13 ~]$ cat test6.py
def getStuInfo(name,age,**k):
print(name)
print(age)
print(k)
getStuInfo('westos',11,a=1,b=2)
d = dict(a=1,b=2)
print(*d)
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test6.py
westos
11
{'a': 1, 'b': 2}
a b
- 函数的返回值
返回值:函数运算的结果,还需要进一步操作,给函数一个返回值
return用来返回函数执行的结果,如果函数没有返回值,默认返回None
一旦遇到return 函数执行结束,后面的代码不会执行
多个返回值的时候,python会帮我们封装成一个元组类型
[kiosk@foundation13 ~]$ vim test7.py
[kiosk@foundation13 ~]$ cat test7.py
def mypow(x,y=2):
#print(x**y)
return x**y,x+y
a = mypow(4)
print(a)
print(mypow(5))
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test7.py
(16, 6)
(25, 7)
- 函数的作用域
局部变量:在函数内部定义的变量,只在函数内部起作用,函数
执行结束后,变量会自动删除
[kiosk@foundation13 ~]$ vim test8.py
[kiosk@foundation13 ~]$ cat test8.py
a = 1
print('outside:',id(a))
def fun():
global a #声明a为全局变量
a = 5
print('inside:',id(a))
fun()
print(a)
print(id(a))
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test8.py
outside: 9326560
inside: 9326688
5
9326688
- 函数的示例
1.编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数.
def cacluate(*a):
sum = 0
b = 0
for i in a:
sum += i
b += 1
ave = sum / b
maxnum = []
for i in a:
if (i > ave):
maxnum.append(i)
return (ave, maxnum)
print(cacluate(2,2,5,6,3,8,6,3,1))
2.编写一个函数, 接收字符串参数, 返回一个元组,‘ehllo WROLD’
元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
def spl(x):
upper=0
lower=0
for i in x:
if i.isupper():
upper+=1
elif i.islower():
lower+=1
return (upper,lower)
a=spl('hello YOU are FAT')
print(a[0],a[1])
3.编写函数, 接收一个列表(包含30个整形数)和一个整形数k, 返回一个新列表.
函数需求:
将列表下标k之前对应(不包含k)的元素逆序;
将下标k及之后的元素逆序;
[1,2,3,4,5] 2 [2,1,5,4,3]
import random
def fun(alist,k):
if k<0 or k > len(alist):
return 'error key'
return alist[:k][::-1] + alist[k:][::-1]
print(fun([1,2,3,4,5],2))
4.编写一个名为collatz()的函数,它有一个名为number的参数。
如果参数是偶数,那么collatz()就打印出number//2,并返回该值。如果number是奇数,collatz()就打印并返回3*number+1。然后编写一个程序,让用户输入一个整数,并不断对这个数调用collatz(),直到函数返回值1(令人惊奇的是,这个序列对于任何整数都有效,利用这个序列,你迟早会得到1!既使数学家也不能确定为什么。你的程序在研究所谓的“Collatz序列”,它有时候被称为“最简单的、不可能的数学问题”)。
输入:
3
输出:
10
5
16
8
4
2
1
def collatz(number):
if number == 1:
exit()
elif number % 2 == 0:
return number // 2
else:
return 3 * number + 1
num = int(input('Num:'))
while True:
num = collatz(num)
print(num)
- 函数的综合练习
题目:两个乒乓球队进行比赛,各出三人。
甲队为a,b,c三人,乙队为x,y,z三人。
已抽签决定比赛名单。有人向队员打听比赛的名单。
a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
T1 = ('a','b','c')
T2 = ('x','y','z')
arr = [] #可能的组合
def comb(i,j,k):
c1 = T1[0] + '-' + T2[i]
c2 = T1[1] + '-' + T2[j]
c3 = T1[2] + '-' + T2[k]
return tuple([c1,c2,c3])
#找出x,y,z的所有组合
for i in range(3):
for j in range(3):
for k in range(3):
if (i == j) or (i == k) or (j == k):
continue
arr.append(comb(i,j,k))
#过滤不符合要求的组合
for g in arr:
if ('a-x' in g) or ('c-z' in g) or ('c-z' in g):
continue
print(g)
END