python——函数

函数

1.定义函数
# 如果不主动调用函数,函数是不会执行的
def say_hello():
print ‘hello1’
print ‘hello2’
print ‘hello3’
# 函数的调用
say_hello()

def sum_2_sum():
“”“对两个数字的求和”“”
num1 = 20
num2 = 20
result = num1 + num2
print ‘%d + %d = %d’ %(num1,num2,result)
sum_2_sum()

“””
函数参数的使用
在函数名后面的小括号内填写 参数
多个参数之间使用 , 分隔
“””
# 定义函数时的变量,叫形参 形参可以任意起名字
def sum_2_sum(num1,num2):
“””
:param num1:
:param num2:
:return:
“””
result = num1 + num2
print ‘%d + %d = %d’ %(num1,num2,result)
# 在调用函数的时候传递得参数称为实参(真实的数据信息)
sum_2_sum(5,20)

2.函数变量的作用域
局部变量(内部变量):在函数内部定义的普通变量,只在被内部引用,函数执行结束变量会自动删除
全局变量:可以被本程序的所有对象或者函数引用
a = 1
print ‘outside:’,id(a)
def fun():
global a # 声明a为全局变量
a = 5
print ‘inside:’,id(a)
fun()
print a
print id(a)

3.函数的四大参数
参数:形参 实参
形参:位置参数 默认参数 可变参数 关键字参数
# 位置参数:形参和实参个数必须保持一致
def getInfo(name,age):
print name,age
getInfo(age=12,name=’westos’)

# 默认参数:形参和实参的个数可以不一致
def mypow(x,y=2):
“””
求x的y次方,y的值默认为2
:param x:
:param y:
:return:
“””
print x**y
mypow(4)
# 默认形参可以改变
mypow(4,3)

# 可变参数
def mysum(*agrs):
“””
*args:是可变参数
args:是元组类型数据
args:名字可变(因为是形参 名字可变)
:param agrs:
:return:
“””
print agrs
sum = 0
for item in agrs:
sum += item
print sum

# 对list tuple set 解包时,只需要在变量前加 *
nums = [1,2,3,4,66,78]
nums1 =(1,2,3,4,5)
nums2 = {1,2,3}
# *nums:解包
mysum(*nums2)
mysum(1,2,3,4,5)

# 关键字参数
def getStuInfo(name,age,**kwargs):
“””
**kwargs:是一个字典;可以传递任意多的key-value对
:param name:
:param age:
:param kwargs:
:return:
“””
print name,age
print kwargs
getStuInfo(‘westos’,18,hobbies=[‘code’,’running’],gender =’female’)

4.函数的返回值
返回值:函数运算的结果,还需要进一步操作时,给一个返回值
return用来返回函数执行结果的,如果没有返回值,默认为None
python可以间接返回多个值(返回了一个元组)
一旦遇到return,函数执行结束,后面的代码不会执行

def mypow(x, y=2):
return x ** y, x + y
print ‘hello’

# 对元组进行解包
a,b = mypow(3)
print a,b

5.函数练习
1). 编写一个名为collatz()的函数,它有一个名为number的参数
如果参数是偶数,那么collatz()就打印出number//2
如果number是奇数,collatz()就打印3*number+1

def collatz(number):
# if number % 2 == 0:
# print number // 2
# else:
# print 3 * number + 1
print number // 2 if number % 2 == 0 else 3 * number + 1
collatz(2)

2). 编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数

def cacluate(*num):
li = [ ]
avg = sum(num)/len(num)
for i in num:
if i > avg:
li.append(i)
return avg,li
count = cacluate(12,13,14,15,16)
print count

3).编写函数, 接收一个列表(包含30个整形数)和一个整形数k, 返回一个新列表.
函数需求:
- 将列表下标k之前对应(不包含k)的元素逆序;
- 将下标k及之后的元素逆序;

import random
def fun(alist, k):
if k < 0 or k > len(alist):
return ‘error key’
newL1 = alist[:k]
newL2 = newL1[::-1]
newL3 = alist[k:]
newL4 = newL3[::-1]
return newL2 + newL4
list = [ ]
for i in range(30):
num = random.randint(1,100)
list.append(num)
print list
a = fun(list,4)
print a

4).模拟轮盘抽奖游戏
轮盘分为三部分: 一等奖, 二等奖和三等奖;
轮盘转的时候是随机的,
如果范围在[0,0.08)之间,代表一等奖,
如果范围在[0.08,0.3)之间,代表2等奖,
如果范围在[0, 1.0)之间,代表3等奖,
模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.

import random
rewardDict = {
‘一等奖’: (0, 0.08),
‘二等奖’: (0.08, 0.3),
‘三等奖’: (0.3, 1)
}
def rewardFun():
“”“用户得奖等级”“”
# 生成一个0~1之间的随机数
num = random.random()
# 判断随机转盘转的数是几等奖
for k, v in rewardDict.items():
# 这里的v是元组
if v[0] <= num < v[1]:
return k
resultDict = { }
for i in range(1000):
# res:本次转盘的等级(一/二/三等奖)
res = rewardFun()
if res not in resultDict:
resultDict[res] = 1
else:
resultDict[res] = resultDict[res] + 1

for k, v in resultDict.items():
print k, ‘———->’, v

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): # 13
# 1.先把数字转换为字符串
n = str(n)
# 2.计算字符串中每个数的平方
sum = 0
for i in n:
sum += int(i) ** 2
return sum
print f(13)
print f(207)
# 1.接收变量
s = raw_input(‘请输入(k,a,b):’) # ‘51 5000 10000’
li = []
for item in s.split(): # [‘51’,’5000’,’10000’]
li.append(int(item))
k, a, b = li
# 2.进行判断是否满足条件
count = 0
for i in range(a, b + 1):
if k * f(i) == i:
count += 1
print count

列表生成式

1.
s = ‘51 5000 10000’
# li = []
# for item in s.split():
# li.append(int(item))
# k,a,b = li
k, a, b = [int(item) for item in s.split()]
# print k,a,b

# 2.生成一个列表,列表元素分别为[1**2,2**2,3**2,4**2…n**2]
li = []
for i in range(1, 8):
li.append(i ** 2)
print li
#
print [i ** 2 for i in range(1, 8)]
#
“””
[experssion for i in 序列 if…]
“””
#
print [i ** 2 for i in range(1, 8) if i % 2 == 0]

import math

1.找出1~10之间的所有偶数,并且返回一个列表(包含以这个偶数为半径的圆的面积)
li = [ ]
for r in range(2, 11, 2): # [2,4,6,8,10]
square = math.pi * r * r
li.append(square)
print li

print [math.pi * r * r for r in range(2, 11, 2)]

2.找出1~10之间的所有奇数,并且返回一个列表(所有的奇数转换为字符串)
print [str(r) for r in range(1,11,2)]

3.找出1~num之间的所有质数
def isPrime(num):
for i in range(2,num):
if num % i == 0:
return False
else:
return True

print [i for i in range(2,101) if isPrime(i)]

生成式练习题
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输
入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
# [2,3,5,7]
- 输入描述:
输入包括一个整数n,(3 ≤ n < 1000)
- 输出描述:
输出对数
- 示例1 :
输入:
10
输出:
2

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,10) if isPrime(i)]
print primeLi
[2,3,5,7]
“””
1.先从列表中拿出两个数
2.判断这两个数之和是否等于num
“””
primePairCount = 0
# for item1 in primeLi:
# for item2 in primeLi:
# if item1 + item2 == 10 and item1 <= item2:
# primePairCount += 1
# print primePairCount
# [2,3,5,7] 2 === 10-2 3 ===10-3 5 ===10-5 7 ===10-7
for item1 in primeLi:
if (10 - item1) in primeLi and item1 <= 10 - item1:
primePairCount +=1
print primePairCount

字典生成式

#1.假设有20个学生,学分在60~100之间,筛选出成绩在90分以上的学生
import random
# stuInfo = {}
# for i in range(20):
# name = ‘westos’ + str(i)
# score = random.randint(60,100)
# stuInfo[name] = score
# # stuInfo[‘westos’+str(i)] = random.randint(60,100)
# hightscore = {}
# for name,score in stuInfo.items():
# if score > 90:
# hightscore[name] = score
# print hightscore
stuInfo = {‘westos’+ str(i):random.randint(60,100) for i in range(20)}
print {name:score for name,score in stuInfo.items() if score >90}

# 2.将字典中的key值和value值调换
d = {‘a’:’apple’,’b’:’bob’,’c’:’cat’}
#print {v:k for k,v in d.items()}
print {k:k.upper()for k,v in d.items()}

# 3.大小写合并,key值最终全部为小写
d1 = {‘A’:10,’b’:3,’a’:5,’B’:8,’d’:1}
print {k.lower():d1.get(k.upper(),0)+d1.get(k.lower(),0)for k,v in d1.items()}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值