一.Python下的函数
1.函数:将重复的代码放入函数中
2.函数的定义
def 函数名():
代码
3.函数的调用:通过函数名()即可完成函数的调用
def say_hello():
print('hello')
say_hello() #定义一个函数,并不会执行,除非调用该函数。输出hello
4.函数里嵌套函数
def redhat():
print('is redhat')
def python():
print('is python')
python()
redhat() #输出is redhatis python
值得注意的是:只调用redhat这个函数的话,不会输出'is python'。想要输出'is python',就必须在里面调用python这个函数
5.函数的参数:
<1>参数:实参和形参
定义函数的时候的变量叫形参(前面不需要定义)。形参的名字可以任意给定。
def welcome(a):
print('hello',a)
真实的数据信息,调用函数的时候传的参数叫做实参。
welcome('lily') #输出hello lily
welcome('xin')
<2>形参:位置参数,默认参数,可变参数,关键字参数
(1)位置参数
def getInfo(name,age):
print(name,age)
getInfo('redhat',11) #输出redhat 11
getInfo(11,'redhat') #输出11 redhat
getInfo(age=11,name='redhat') #输出redhat 11
(2)默认参数
(1)形参和实参可以不一致
def mypow(x,y=4):
print(x**y)
mypow(2) #输出16
mypow(2,3) #输出8,当实参和形参不一致时,以实参为准(2)默认参数要写在最后。(即顺序是有要求的。)
def mypow(y=4,x):
print(x**y)
mypow(x=2) #输出会报错
mypow(2,x=3) #输出会报错(3)默认参数可以有多个
def mypow(x,y=3,z=4):
print(x+y+z)
mypow(2) #输出9
mypow(2,5) #输出11,可以写y=3,也可以直接写3。因为顺序已经指定好了(但如果参数的顺序没有指定好的时候,参数的名字就不能年损裂(比如“print”这个函数))
(3)可变参数(*args——表示没有名字的多个参数,也可以不叫args,叫其他名字,但是一般叫args)
def mysum(*args):
"""
:param args:
:return:
*a:可变参数
a:是元组数据类型
"""
sum = 0
for item in args:
sum += item
print(sum)
mysum(1,2,3,4,5,6,7,8,9) #输出45
(4)关键字参数(**kwargs——表示有名字的多个参数)
def getStuInfo(name,age,**kwargs):
"""
**kwargs是一个字典,可以传递任意多的key-value
:param name:
:param age:
:param kwargs:
:return:
"""
print(name,age)
print(kwargs)getStuInfo('westos','19',hobbies=['coding','running'],gender='female')
#输出westos 19
#输出{'hobbies': ['coding', 'running'], 'gender': 'female'}
也可以利用下面的列表或者元组(其实args打印出来的是元组,而非列表),字典进行传参。
def test(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
sum=x
for i in args:
sum+=i
for i in kwargs.values():
sum+=i
print('和为%s' %sum)nums=[3,4]
nums2={'num1':5,'num2':6}
test(2,*nums,**nums2)
#输出2
#输出(3, 4)
#输出{'num1': 5, 'num2': 6}
#输出和为20
6.函数的返回值
返回值:函数运行的结果,还需要进一步操作时,给一个返回值
return用来返回函数执行结果,如果没有返回值,默认为None
python可以间接返回多个值(返回了一个元组)
一旦遇到return,函数执行结束,后面的代码不会执行def mypow(x,y=2):
return x ** y,x +y
print('hello')a,b = mypow(3,4)
print(a,b) #输出81 7
def mypow(x,y=2):
print(x ** y)a = mypow(2) #输出4
print(a) #输出None,这是因为函数没有返回值,所以输出为None使用多个变量来接收返回值
def test1():
a=1
b=2
return a,b
x,y=test1()
print(x,y) #输出1 2使用一个变量(元组)来返回多个值
def test1():
a=1
b=2
return a,b
x=test1()
print(x) #输出(1,2)使用一个变量(列表)来返回多个值
def test1():
a=1
b=2
return [a,b]
x=test1()
print(x) #输出[1,2]
7.局部变量和全局变量
(1)局部变量:在函数内部定义的变量,只在函数内部起作用,函数执行结束,变量会自动删除。
def test1():
a=200
print('a的值为%s' %a)
test1() #输出a的值为200
def test1():
a=200
a+=1
print('a的值为%s' %a)
test1() #输出a的值为201
下面的程序出错(因为在打印之前函数没有被调用)
def test1():
a=200
a+=1
print('a的值为%s' %a)
print(a)
test1()
下面的程序出错(因为变量是局部变量,只在函数内部生效)
下面的程序表明,在函数中定义一个变量,默认是局部变量。
def test1():
a=200 #局部变量只能在该函数中使用(它的作用范围在改函数内部)
a+=1
print('a的值为%s' %a)
test1()
print(a)
想要在函数中定义全局变量,就必须加关键字"global"
def test1():
global a #声明函数中定义的变量a为全局变量。
a=200 #局部变量只能在该函数中使用(它的作用范围在改函数内部)
a+=1
print('a的值为%s' %a)
test1() #输出a的值为201
print(a) #输出201(2)全局变量:在函数外面定义的变量叫做全局变量
a=400 #全局变量,可以在后面的代码中使用。
def test1():
a=200
print('a的值为%s' %a)
def test2():
a=300
print('test2函数中a的值为%s' %a)
test1() #输出“a的值为200”
test2() #输出“test2函数中a的值为300”
print(a) #输出“400”
下面的代码表明,在前面定义了全局变量的话,在函数里面也可以使用全局变量
a = 1
print('outside:',id(a)) #id(变量名):用来查看变量的内存地址def fun():
global a #声明全局变量
a = 5
print('inside:',id(a))fun()
print(a)
print(id(a))
#输出 outside: 9334784
#输出 inside: 9334912
#输出 5
#输出 9334912
def fun():
# global a #这行代码注释
a = 5 #定义局部变量a
print('inside:',id(a))fun()
print(a)
print(id(a))
#输出 outside: 9334784
#输出 inside: 9334912
#输出 1
#输出 9334784
二.Python下函数的练习
1.练习一:
** 案例1:
编写一个函数cacluate, 可以接收任意多个数,返回一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数.
def calculate(*args):
# 求平均数
avg=sum(args)/len(args)
# 定义一个空列表,用于存放大于平均数的值
l = []
#求大于平均值的数,并将其加到l列表中
for j in args:
if j>avg:
l.append(j)
return avg,l
print(calculate(2,3,4,5,6,7))
2.练习二:
**案例2:
编写一个函数, 接收字符串参数, 返回一个元组。
元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
def str_upper_lower(a):
upper_count,lower_count=0
for i in a:
if i.isupper():
upper_count+=1
elif i.islower():
lower_count+=1
return upper_count,lower_count
print(str_upper_lower(input('请输入一个字符串:')))
3.练习三:
**案例3:
编写函数, 接收一个列表(包含30个1~100之间的随机整型数)
和一个整型数k, 返回一个新列表.
函数需求:
- 将列表下标k之前对应(不包含k)的元素逆序;
- 将下标k及之后的元素逆序;
例如:[1,2,3,4,5] 2 [2,1,5,4,3]
import random
def reverse_list(l,k):
if k<0 or k>len(l):
return 'error k'
return l[:k][::-1]+l[k:][::-1]
#定义一个空列表l1,用来存放随机产生的30个数
l1=[]
for j in range(30):
l1.append(random.randint(1,100) )
print(l1)
print(reverse_list(l1,2))
4.练习四:
模拟轮盘抽奖游戏
# 轮盘分为三部分: 一等奖, 二等奖和三等奖;
# 轮盘转的时候是随机的,
# 如果范围在[0,0.08)之间,代表一等奖,
# 如果范围在[0.08,0.3)之间,代表2等奖,
# 如果范围在[0.3, 1.0)之间,代表3等奖,# 模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.
import random
#定义一个字典,用来存放数据
d={}.fromkeys({'一等奖','二等奖','三等奖'},0)
# d={'一等奖':0,'二等奖':0,'三等奖':0}
def prize():
num = random.random()
if num > 0 and num < 0.08:
d['一等奖'] += 1
elif num >= 0.08 and num < 0.3:
d['二等奖'] += 1
elif num >= 0.3 and num < 1:
d['三等奖'] += 1
for i in range(1000):
prize()
print(d)
5.练习五:腾讯笔试编程题
腾讯笔试编程题:
题目需求:
对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
f(13) = 1**2 + 3**2 = 10
f(207) = 2**2 + 0**2 + 7**2 = 53
下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b,
且k*f(n)=n
输入:
第一行包含3个正整数k,a, b, k>=1, a,b<=10**18, a<=b;
输出:
输出对应的答案;范例:
输入: 51 5000 10000
输出: 3
def f(n):
#1.先把数字转换为字符串
n=str(n)
#2.计算字符串中每个数字的平方和
sum=0
for item in n:
sum+=int(item)**2
return sum
#1.接收变量k,a,b
s=input()
#2.存储整型k,a,b
li=[]
for item in s.split():
li.append(int(item))
k,a,b=li
#3.进行判断是否满足条件
count=0
for i in range(a,b+1):
if k*f(i)==i:
count+=1
print(count)
三.集合推导式
print({i**2 for i in {1,2,3,3}}) #输出{1, 4, 9}
print({i**2 for i in {1,2,3,9,12,9} if i%3==0}) #输出{81, 9, 144}总结:
{表达式 for i in range序列 if...}。其中if...是可以损裂的。
四.列表推导式
1.列表推导式的基本格式
li=[]
for i in range(1,9):
li.append(i**2)
print(li) #输出[1, 4, 9, 16, 25, 36, 49, 64]print([i**2 for i in range(1,9)]) #输出[1, 4, 9, 16, 25, 36, 49, 64]
总结:
[表达式 for i in range序列 if...]。其中if...是可以损裂的。
2.列表推导式的练习
<1>练习一:求圆的面积
#1.找出1-10之间的所有偶数,
# 并返回一个列表(包含以这个偶数为半径的圆的面积)
import math
print([math.pi *r *r for r in range(1,11) if r%2==0])
#输出[12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676, 314.1592653589793]
或
import math
print([math.pi *r *r for r in range(2,11,2)])
#输出[12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676, 314.1592653589793]
值的注意的是,要导入math这个模块,派的输出为math.pi。
<2>练习二:求取质数
#2.找出1~100之间所有的质数
def func(n):
for i in range(2,n):
if n%i==0:
return False
else:
return True
print([i for i in range(2,101) if func(i)])
<3>练习三:求取质数对
(2018-腾讯-在线编程题)
- 题目描述:
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整
数,并输出结果。输
入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别
为(5,5),(3,7))
# [2,3,5,7]
- 输入描述:
输入包括一个整数n,(3 ≤ n < 1000)
- 输出描述:
输出对数
- 示例1 :
```
输入:
10
输出:
2
"""
def isPrime(n):
for i in range(2,n):
if n%i==0:
return False
return True
num=int(input())
prime_li=[i for i in range(2,num) if isPrime(i)]
prime_count=0
for j in prime_li:
if (num-j) in prime_li and j<=num-j:
prime_count+=1
print(prime_count)
五.字典推导式
1.字典推导式的基本格式
d=dict(a=1,b=2)
print(d) #输出{'a': 1, 'b': 2}new_d={}
for i in d:
new_d[i.upper()]=d[i]print(new_d) #输出{'A': 1, 'B': 2}
或
d=dict(a=1,b=2)
print({k.upper():v for k,v in d.items()}) #输出{'A': 1, 'B': 2}总结:
[键:值 for k,v in 字典.items if...]。其中if...是可以损裂的。
2.字典推导式的练习
<1>练习一:
d = dict(a=2,b=1,c=2,B=9,A=10)
#输出{'a':12,'b':10,'c':2}
d={'a':2,'b':1,'c':2,'B':9,'A':10}
new_d={}
for k,v in d.items():
if k.lower() in new_d:
new_d[k.lower()]+=v
else:
new_d[k.lower()]=v
print(new_d) #输出{'a': 12, 'b': 10, 'c': 2}
或
d={'a':2,'b':1,'c':2,'B':9,'A':10}
print({k.lower():d.get(k.lower(),0)+d.get(k.upper(),0) for k,v in d.items()})
#输出{'a': 12, 'b': 10, 'c': 2}
六.高阶函数
1.高阶函数的介绍
高阶函数
实参是一个函数名
函数的返回值也是一个函数def fun(x,y,f):
return f(x),f(y)print(fun(-10,-20,abs)) #输出(10, 20)
函数本身也可以赋值给变量,变量也可以指向函数
f=abs
print(f(-10)) #输出10
2.python3.6内置的高阶函数
<1>map函数
(1)map函数简介
map()函数接收两个参数,一个是函数,一个是序列(list,tuple,set集合)
map将传入的函数依次作用到序列的每个元素,并且把结果作为新的列表返回。所以:自己定义的函数必须有一个形参
(2)map函数练习
练习一:
对于序列[-1,3,-5,-4]的每个元素求绝对值
print(map(abs,[-1,3,5,-4])) #输出类
#想要变成列表,需要转换
print(list(map(abs,[-1,3,5,-4]))) #输出[1, 3, 5, 4]
练习二:
对于序列的每个元素求阶乘(10个,2~7之间的随机)
#方法一:
import random
def jc(n):
result = 1
for i in range(1,n+1):
result*=i
return result
l=[]
for i in range(10):
l.append(random.randint(2,7))
print(l)
print(list(map(jc,l)))
#方法二:
import random
import math
l=[]
for i in range(10):
l.append(random.randint(2,7))
print(list(map(math.factorial,l)))
值的注意的是,要导入math这个模块,求阶乘这个函数为:math.factorial()。
<2>reduce函数
reduce:把一个函数作用在一个序列(list,tuple,set集合)上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素累计计算。
reduce(f,[x1,x2,x3,x4,x5]) = f(f(f(f(x1,x2),x3),x4),x5)所以:自己定义的函数必须有两个形参
from functools import reduce
def multi(x,y):
return x*yprint(reduce(multi,range(1,4))) #输出6
def add(x,y):
return x+yprint(reduce(add,[1,2,3,4,5])) #输出15
值的注意的是:要使用reduce这个函数,必须从functools中导入reduce函数
<3>filter函数
(1)filter函数介绍
filter过滤函数
和map类似,也接收一个函数和一个序列
但是和map不同的是,filter把传入的函数依次作用于每个元素
然后根据返回值是True还是False决定保留还是丢弃该元素所以:自己定义的函数必须有一个形参
(2)filter函数练习
练习一:输出0-10之间的偶数
def isodd(num):
if num%2==0:
return True
else:
return False
print(filter(isodd,range(10))) #输出类
#想要编程列表,必须转换
print(list(filter(isodd,range(10)))) #输出[0,2,4,6,8]
练习二:输出1-100之间的质数
def isPrime(num):
for i in range(2,num):
if num%i==0:
return False
else:
return True
print(list(filter(isPrime,range(2,101))))