目录
一、函数
【函数定义与调用】
【形参与实参】
【return语句】
【变量作用域】
【可变长度参数】
二、lambda表达式
三、案例
【例题1】
【例题2】
【例题3】
【例题4】
【例题5】
一、函数
【函数定义与调用】
【例子】一个穷小子想娶富家之女,她父亲说,你第一天给我2元钱,第二天给我4元钱,第n天给我2^n,总共给30天。穷小子一个月存 10000 元,问多少个月可以抱得美人归?
【形参与实参】
- 定义函数时的参数称为形式参数 (简称形参) ,调用函数时的参数称为实在参数 (简称实参)
- 一般类型的数据作为参数相当于传值调用,可变类型的序列作为参数相当于传地址调用
- 定义函数时不需要指定参数的类型和返回值的类型
- 普通参数、默认值参数、关键参数、可变长度参数
【return语句】
- return 语句用于函数体,可以结束函数的运行并返回 return 后的表达式
- 没有return语句的函数,或者 return 语句后没有表达式的函数,其返回值为None
- 任何函数都可以作为表达式的一份子,也可以作为独立语句调用
【变量作用域】
- 变量起作用的代码范围称为变量的作用域,不同作用域内同名变量之间互不影响
- 函数内部定义的变量一般为局部变量,而不属于任何函数的变量一般为全局变量
- 局部变量的引用速度比全局变量快,应优先考虑使用
- 尽量避免使用全局变量
- 一个变量已经在函数外定义,如果在函数内需要使用这个变量,并将改变变量的结果反映到函数之外,可以在函数内用 global 声明这个变量
- 在函数内部直接使用 global 关键字可以将一个变量声明为全局变量
【可变长度参数】
def demo1(*p): # *参数-解包操作符
print(p)
demo1(5,2,0)
def demo2(**p): #**关键字参数-解包操作符
for item in p.items():
print(item)
demo2(a=5,b=2,c=0)
(5, 2, 0)
('a', 5)
('b', 2)
('c', 0)
>>>
二、lambda表达式
- lambda 定义了一个匿名函数,并不会带来程序运行效率的提高,只会使代码更简洁
- 如果可以使用 for..in...if 来完成的,坚决不用 lambda
a_list=[1,3,1,4]
print(a_list)
b=list(map((lambda x:x*100),a_list))
print(b)
a_dict={'i':99,'love':98,'you':97}
b_list=sorted(a_dict)
print(b_list)
c_list=sorted(a_dict.values())
print(c_list)
d_list=sorted(a_dict.items(),key=lambda x:x[1])
print(d_list)
[1, 3, 1, 4]
[100, 300, 100, 400]
['i', 'love', 'you']
[97, 98, 99]
[('you', 97), ('love', 98), ('i', 99)]
>>>
三、案例
【例题1】
【例题】编写函数,接收字符串参数,返回一个元组,其中第一个元素为大写字母个数,第二个元素为小写字母个数。
def tupleCout(s):
result=[0,0]
for ch in s:
if ch.islower():
result[1]+=1
elif ch.isupper():
result[0]+=1
return tuple(result)
s="After All, Tomorrow is Another Day!"
print(tupleCout(s))
(5, 23)
>>>
【例题2】
【例题】编写函数,计算字符串匹配的准确率。以打字练习程序为例,假设 origin 为原始内容,userlnput 为用户输入的内容,测试用户输入的准确率。
def Rate(origin,userInput):
right=sum(1 for o,u in zip(origin,userInput) if o==u)
return round(right/len(origin),2) #round()四舍五入
a="Life is not a matter of a day."
print("请输入: Life is not a matter of a day.")
b=input()
print(int(Rate(a,b)*100),'%')
请输入: Life is not a matter of a day.
Life is not a matt of a day
63 %
>>>
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
>>> list(zip('abcdefg', range(3), range(4)))
[('a', 0, 0), ('b', 1, 1), ('c', 2, 2)]
zip 对象产生长度为 n 的元组,其中 n 是作为位置参数传递给 zip() 的可迭代对象的数量。每个元组中的第 i 个元素来自 zip() 的第 i 个 iterable 参数。这一直持续到最短的参数耗尽为止。
【例题3】
【例题】编写函数模拟猜数游戏。系统随机产生一个数,玩家最多可以猜7次。系统根据玩家的猜测进行提示,玩家则可以根据系统的提示对下一次的猜测进行适当调整。
from random import randint
def guess(maxValue=100,maxTimes=7):
value=randint(1,maxValue) #随机生成一个整数
for i in range(maxTimes):
prompt='Start to GUESS:' if i==0 else 'Guess again:'
#使用异常处理结构,防止输入不是数字的情况
try: x=int(input(prompt))
except: print('Must input an integer between 1 and ',maxValue)
else: #猜对了
if x==value: print('Congratulation!'); break
elif x>value: print('Too big')
else: print('Too little')
else: #次数用完还没猜对,游戏结束,提示正确答案
print('Game over.FAIL.')
print('The value is ',value)
print(guess())
Start to GUESS:50
Too big
Guess again:25
Too little
Guess again:30
Too little
Guess again:40
Too little
Guess again:45
Congratulation!
None
>>>
【例题4】
【例题】编写函数模拟报数游戏。有 n 个人围成一圈,顺序编号,从第一个人开始从 1 到 k (假设 k=3 )报数,报到 k 的人退出圈子,然后圈子缩小,从下一个人继续游戏,问最后留下的是原来的第几号。
from itertools import cycle
def numberoff(lst,k):
t_lst=lst[:] #切片,以免影响原来的数据
while len(t_lst)>1: #游戏一直进行到只剩下最后一个人
#print(t_lst)
c=cycle(t_lst) #创建cycle对象,cycle()循环遍历
for i in range(k): #从1到k报数
t=next(c)
index=t_lst.index(t) #一个人出局,圈子缩小
t_lst=t_lst[index+1:]+t_lst[:index]
return t_lst[0]
lst=list(range(1,8))
print(numberoff(lst,3))
4
【例题5】
【例题】利用蒙特·卡罗方法计算圆周率近似值。
假设圆的半径是1,那么圆的面积就是pi,正方形的的面积是4,随机产生正方形中的点,那么这个点落在园的概率是圆面积/正方形面积,g=pi/4,这个点落在圆内的判断:x*x+y*y<=1
from random import random
def estimatePI(times):
hits=0
for i in range(times):
x=random()*2-1 #random()生成介于0和1之间的小数
y=random()*2-1 #该数字乘以2再减1,则介于-1和1之间
if x*x+y*y<=1: #落在圆内或园周上
hits+=1
return 4.0*hits/times
print(estimatePI(10000))
print(estimatePI(100000))
print(estimatePI(1000000))
print(estimatePI(10000000))
print(estimatePI(100000000))
3.144
3.12892
3.14398
3.1412452
3.14146116
>>>
以上,Python语言快速入门下1
祝好