函数的定义即调用
函数是封装起来的代码功能。定义时使用 def
在使用函数时需要先调用,才可以使用。
def hello(): # 函数的定义
print('hello1')
print('hello2')
print('hello3')
hello() # 函数的调用,直接输函数名
def add():
num1 = 20
num2 = 30
result = num1 + num2
print('%d+%d=%d' %(num1,num2,result))
add() # 调用
嵌套函数:
在函数中定义函数时,直接调用外层函数不能调用到嵌套的函数,需要在函数中执行调用才可以:
def westos():
print('westos')
def python():
print('python')
python()
westos()
并且python这个函数在外部是没有被定义的,只有存在在westos函数中。
def welcome(a): a是形参,用来接收用户输入的内容,
print('hello',a)
welcome('laoli') 实参,用户输入的是什么,a 就是什么
welcome('woain')
参数
“”"
参数: 形参 实参
形参:位置参数 默认参数 可变参数 关键字参数
实参: 用户传输的
“”"
位置参数
def getinfo(name,age): 定义参数
print(name,age)
getinfo('west',11) 定义实参
getinfo(11,'west')
getinfo(11,'west',12)
可见形参是根据实参位置决定的,这就是位置参数的特点,有些不合理的地方。
我们可以这样写:
默认参数
pow(x,y)函数可以求出x的y次方
我们定义一个
def mypow(x,y=2): y=2 就是默认参数,位指定实参y时y默认为2
print(x**y)
mypow(4) 未指定y
mypow(2,3) 指定y = 3
2的3次方等于8没问题
可变函数
def mysum(*a): *可以接收多个变量,为可变函数
sum = 0
for item in a:
sum += item 这是一个求和器
print(sum)
mysum(1,2,3,4,5)
关键字参数
def getinfo(name,age,**kwargs): 用 **kwargs 表示关键字参数,他是一个字典,可以传输任意个键值对。
print(name,age)
print(kwargs)
getinfo('westos',11,gender='boy',hobby=['running','coding'])
返回值
函数的返回值就是函数的运算结果 return 可以返回一个元组。且return下面的命令不执行。
return返回的值可以定义为变量。
def mypow(x,y=2):
return x ** y, x + y
print('hello world') # 不会执行
a,b = mypow(3) # 把返回值定义为变量
print(a,b)
变量的作用域
变量分为局部变量和全局变量。
局部变量:在函数内部定义的变量,只在函数内部起作用,函数执行结束,变量会自动删除
全局变量:始终生效
a = 1
print('outside:',id(a)) id可以查看变量在内存中的存储位置,此时为全局变量
def fun():
a = 5
print('inside:',id(a)) 此时a为局部变量,函数执行结束变量就不起作用了
fun()
print(a) 查看a 的值
print(id(a)) 查看a的位置
在全局变量存储位置和局部变量存储位置不同,最后打印出来的值和全局变量的一致。
如何将局部变量转化为全局你变量: global
用 global 语句去声明变量,一般不用。
练习:
** 案例1:
编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数.
def cacluate(*args):
avg = sum(args) / len(args)
up_avg = []
for item in args:
if item > avg:
up_avg.append(item)
return avg,up_avg
a = cacluate(1,2,3,4,5,6,7)
print(a)
**案例2:
编写一个函数, 接收字符串参数, 返回一个元组,‘ehllo WROLD’
元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
def fun(x):
upper_count = 0
lowwer_count =0
for i in x:
if i.isupper():
upper_count += 1
elif i.islower():
lowwer_count += 1
else:
continue
return upper_count,lowwer_count
a = fun('hello WORLD')
print(a)
练习3:
**案例3:
编写函数, 接收一个列表(包含30个1~100之间的随机整形数)和一个整形
数k, 返回一个新列表.
函数需求:
- 将列表下标k之前对应的元素逆序;
- 将下标k及之后的元素逆序;
[1,2,3,4,5] 2 [2,1,5,4,3]
def fun(li,k):
if k< 0 or k> len(li):
return 'Error k'
return li[:k][::-1] + li[k:][::-1] 返回值需要打印出来,不然看不到
print(fun([1,2,3,4,5],2))
练习4:
模拟轮盘抽奖游戏
#轮盘分为三部分: 一等奖, 二等奖和三等奖;
#轮盘转的时候是随机的,
如果范围在[0,0.08)之间,代表一等奖,
如果范围在[0.08,0.3)之间,代表2等奖,
如果范围在[0.3, 1.0)之间,代表3等奖,模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.
import random
rewardDict = {
'一等奖': (0,0.08),
'二等奖': (0.08,0.3),
'三等奖': (0.3,1)
}
def userfun():
num = random.random()
for k,v in rewardDict.items():
if v[0] <= num < v[1]:
return k
resultDict = {}
for i in range(1000):
res = userfun()
if res not in resultDict:
resultDict[res] = 1
else:
resultDict[res] += 1
for k,v in resultDict.items():
print(k,'--->',v)
练习五:
“”"
腾讯笔试编程题:
题目需求:
对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
f(13) = 12 + 32 = 10
f(207) = 22 + 02 + 72 = 53
下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b,
且k*f(n)=n
输入:
第一行包含3个正整数k,a, b, k>=1, a,b<=1018, a<=b;
输出:
输出对应的答案;范例:
输入: 51 5000 10000
输出: 3 “”"
#定义f(n)
def f(n):
n = str(n)
sum = 0
for item in n:
sum += int(item) ** 2
return sum
#建立数值列表
s = input('Input your number')
li = []
for item in s.split():
li.append(int(item)) #把用户输入的数字转换为整型
#求解
k,a,b = li
list = [] # 用于查看具体数字
count = 0
for n in range(a,b+1):
if k*f(n) == n: #条件
list.append(n)
count += 1
print(count)
print(list)
生成式
用法:
[expression for i in seq if...]
s = '51 500 1000'
li = []
for item in s.split():
li.append(int(item))
print(li)
k,a,b = li
print(k,a,b)
或者生成式的方法:
s = '51 500 1000'
k,a,b = [int(item) for item in s.split()]
print(k,a,b)
#1 普通方法生成数字的平方的列表
li = []
for i in range(1,11):
li.append(i**2)
print(li)
#2
print([i**2 for i in range(1,11)]) 生成式方法
print([i**2 for i in range(1,11) if i %2 == 0]) 求出偶数的
l练习:
找出1到100之间的质数:
#先定义函数,在生成式中调用
def isPrime(num):
for n in range(2,num):
if num % n == 0:
return False
else:
return True
# 写生成式
print([i for i in range(2,101) if isPrime(i)]) 上面的 num 等于这个 i
练习2:
(2018-腾讯-在线编程题)
- 题目描述: 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,>并输出结果。输 入值小于1000。 如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7)) [2,3,5,7]
- 输入描述: 输入包括一个整数n,(3 ≤ n < 1000)
- 输出描述: 输出对数
- 示例1 :
输入: 10
输出::2
num = int(input())
def isPrime(num):
for i in range(2,num):
if num % i == 0:
return False
else:
return True
primeli = [i for i in range(2,num) if isPrime(i)]
print(primeli)
primelicount = 0
for item in primeli:
if (num - item) in primeli and item <= (num - item):
primelicount += 1
print(primelicount)
5+5=10
3+7=10
3+17=20
17+3=20
练习3:
需求1:假设有20个学生,学生名为westosX,学生分数在60~100之间,筛选出 成绩在90分以上得学生
import random
stuInfo = {}
for i in range(20):
name = 'westos' + str(i)
score = random.randint(60,100)
stuInfo[name] = score
#原始方式:
highScore = {}
for name,score in stuInfo.items():
if score >= 90:
highScore[name] = score
print(highScore)
#生成式方式:
print({name : score for name,score in stuInfo.items() if score >= 90})
需求二.key --> upper 把所有的key值变为大写
d = dict(a=1,b=2) 工厂函数
print(d)
#普通方式
new_d = {}
for i in d:
new_d[i.upper()] = d[i]
print(new_d)
#生成式方式:
print({k.upper():v for k,v in d.items()})
可以看出效果相同。
需求3:大小写key值合并,统一以小写输出 d = dict(a=2, b=1, c=2, B=9, A=10)
#输出{‘a’: 12, ‘b’: 10, ‘c’: 2}
d = dict(a=2, b=1, c=2, B=9, A=10)
new_d = {}
#普通方法
for k,v in d.items():
low_k = k.lower()
if low_k not in new_d:
new_d[low_k] = v
else:
new_d[low_k] += v
print(new_d)
#列表生成式方法
print({k.lower(): d.get(k.lower(), 0) + d.get(k.upper(), 0) for k in d})
用get函数获取大小学key的value值并相加。