file: day04_函数01.py
date: 2018-08-30 9:17 AM
author: westos-dd
desc:
"""
# # 定义函数
# # 如果不主动调用函数,函数是不会执行的
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)
file: day04_函数变量的作用域.py
date: 2018-08-30 10:03 AM
author: westos-dd
desc:
局部变量:在函数内部定义的普通变量,只在函数内部作用,函数执行结束
变量会自动删除
全局变量
"""
a = 1
print 'outside:',id(a)
def fun():
global a # 声明a为全局变量
a = 5
print 'inside:',id(a)
fun()
print a
print id(a)
file: day04_函数形参之四大参数.py
date: 2018-08-30 9:43 AM
author: westos-dd
desc:
参数:形参 实参
形参:位置参数 默认参数 可变参数 关键字参数
"""
# 位置参数:形参和实参个数必须保持一致
def getInfo(name,age): print name,age getInfo(age=12,name='westos')
def mypow(x,y=2): 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)
# 4.关键字参数
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')
file: day04_引用.py
date: 2018-08-30 10:35 AM
author: westos-dd
desc:
"""
def test(num):
print '在函数内部%d对应的内存地址是%d' %(num,id(num))
result = 'hello'
print '函数要返回的数据的内存地址是 %d' %id(result)
return result
a = 10
print 'a变量保存数据的内存地址是%d' %id(a)
r = test(a)
print '%s 的内存地址是 %d' %(r,id(r))
file: day04_函数的返回值.py
date: 2018-08-30 10:02 AM
author: westos-dd
desc:
"""
"""
返回值:函数运算的结果,还需要进一步操作时,给一个返回值
return用来返回函数执行结果的,如果没有返回值,默认为None
python可以间接返回多个值(返回了一个元组)
一旦遇到return,函数执行结束,后面的代码不会执行
"""
def mypow(x, y=2):
return x ** y, x + y
print 'hello'
# pass
# 对元组进行解包
a,b = mypow(3)
print a,b
file: day04_函数练习02.py
date: 2018-08-30 10:03 AM
author: westos-dd
desc:
案例1:
编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数
案例2:
编写函数, 接收一个列表(包含30个整形数)和一个整形数k, 返回一个新列表.
函数需求:
- 将列表下标k之前对应(不包含k)的元素逆序;
- 将下标k及之后的元素逆序;
"""
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
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
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],2)
file: day04_函数练习03.py
date: 2018-08-30 10:03 AM
author: westos-dd
desc:
模拟轮盘抽奖游戏
# 轮盘分为三部分: 一等奖, 二等奖和三等奖;
# 轮盘转的时候是随机的,
# 如果范围在[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
# print rewardFun()
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
file: day04_函数练习04.py
date: 2018-08-30 3:04 PM
author: westos-dd
desc:
1.编写一个函数, 接收一个字符串参数, 返回一个元组,'ehllo WROLD'
元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
2.打字软件正确率
编写函数, 计算字符串匹配的准确率.(类似于打字软件)
orginStr为原始内容, userStr为用户输入内容;
"""
file: day04_函数练习_腾讯笔试编程题.py
date: 2018-08-30 10:04 AM
author: westos-dd
desc:
题目需求:
对于一个十进制的正整数, 定义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
file: day04_函数练习题01.py
date: 2018-08-30 9:32 AM
author: westos-dd
desc:
练习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)
file: day04_函数_装饰器.py
date: 2018-08-30 4:14 PM
author: westos-dd
desc:
装饰器:
"在不改变原函数的基础上,给函数增加功能"
把一个函数当作参数,返回一个替代版的函数
本质上:返回函数的函数
"""
def func1(): print 'have a nice day!' def func2(): print 'good luck!' def outer(func): def inner(): print '*********' func() print '&&&&&&&&&' inner() outer(func1) outer(func2)
# def func1():
# print 'have a nice day!'
# def func2():
# print 'good luck!'
#
# def outer(func):
# def inner():
# print '*********'
# func()
# print '&&&&&&&&&&&&'
# return inner
#
# func1 = outer(func1)
# func1()
def say(age):
print 'man is %d years old' % age
def outer(func):
def inner(age):
if age < 0:
age = 0
func(age)
return inner
# "化妆过的函数"
say = outer(say)
# 其实是调用的新的函数
say(-10)
file: day04_函数_装饰器02.py
date: 2018-08-30 4:54 PM
author: westos-dd
desc:
"""
def desc(fun):
def add_info():
print '中秋快乐'
fun()
print '西开欢迎你'
return add_info
# 语法糖
@desc
def login():
# print '中秋快乐...'
print 'login....'
# print '西开欢迎你...'
@desc # login = desc(login)
def logout():
print 'logout....'
@desc
def savemoney():
print '存钱...'
@desc
def transferMoney():
print '转账....'
# def ..
login()
logout()
savemoney()
transferMoney()
file: day04_列表生成式.py
date: 2018-08-30 3:07 PM
author: westos-dd
desc:
"""
# # 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]
# 1.找出1~10之间的所有偶数,并且返回一个列表(包含以这个偶数为半径的圆的面积)
import math
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)]
file: day04_生成式练习_腾讯笔试题.py
date: 2018-08-30 3:08 PM
author: westos-dd
desc:
(2017-腾讯-在线编程题)
- 题目描述:
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输
入值小于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
file: day04_字典生成式.py
date: 2018-08-30 3:58 PM
author: westos-dd
desc:
"""
#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()}
###########file: 动图处理.py##########
date: 2018-08-30 10:53 AM
author: westos-dd
desc:
"""
import random
from PIL import Image, ImageSequence
with Image.open('cat.gif') as im:
print(im.is_animated, im.n_frames)
# 判断图片是否为动图
if im.is_animated:
# 列表生成式
frames = [f.copy() for f in ImageSequence.Iterator(im)]
# 对列表反转(以下两行代码只写其中一行就行了)
#frames = frames[::-1]
# frames.reverse()
# 对于动图的帧列表元素打乱顺序
random.shuffle(frames)
frames[0].save('out.gif', save_all=True, append_images=frames[1:])
#####################################