Python基础(三)

函数

函数的理解与定义

范例:
    def print(self, *args, sep=' ', end='\n', file=None):
    def min(*args, key=None):

格式:    
    def 函数名():
        函数体
定义一个函数
# 在没有调用函数的情况下,函数是不会被执行的
def hello():
    print('hello')
    print('hello')

# 调用函数
hello()
函数里面嵌套函数
def fentiao():
    print('is fentiao....')
    def westos():
        print('westos')
    westos()

fentiao()
形参和实参
def func1(a):
    # 定义函数时的变量称为形式参数,变量名可以任意起
    print('hello %s' %(a))

# 调用函数时的参数称为实参,该参数必须是实际存在的
func1(12)
func1('linux')
func1('python')

练习
编写一个名为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)
    
collatz(2)

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

运行结果:
在这里插入图片描述

函数动态添加成员

def fun():
    print(fun.x)
    fun()  

# 动态添加
fun.x = 3
fun()

# 动态删除
del fun.x
fun()

函数的返回值

函数调用时一般有返回值,没有定义返回值的时候,python中默认返回None

def hello():
    print('hello')

res = hello()
print(res)

在这里插入图片描述

return
def hello():
    # return 返回的表达式或者变量
    return 'hello'

res = hello()
print(res)

在这里插入图片描述

return的应用

随机生成20个学生的成绩,并判断这20个学生的等级

import random

def get_level(score):
    if 90 < score <= 100:
        return 'A'
    elif 80 < score <= 90:
        return 'B'
    else:
        return 'C'

def main():
    for i in range(20):
        score = random.randint(1,100)
        print('成绩为%s,等级为%s' %(score,get_level(score)))

main()

在这里插入图片描述

return返回多个值
def fun(a):
    # 接收一个列表,求这个列表的最大值,平均值,最小值
    max_num = max(a)
    min_num = min(a)
    avg_num = sum(a) / len(a)
    # python函数中,只能返回一个值
    # 如果非要返回多个值,会把返回的值封装为一个元组数据类型
    return max_num,min_num,avg_num
    
variables = fun([1,2,34,5,67,89,120])
print(variables,type(variables))

在这里插入图片描述

函数形参之四大参数类型

参数:形参 实参
形参的分类:位置参数 默认参数 可变参数 关键字参数

位置参数

形参和实参必须保持一致

def getInfo(name,age):	# 按照位置传递参数
    print(name,age)
getInfo(age=18,name='westos')
默认参数

形参和实参可以不一致

def mypow(x,y=2):
    # 求x的y次幂
    print(x**y)
# 输入一个变量时,默认y=2
mypow(3)
mypow(2,3)

在这里插入图片描述

可变参数
def mySum(*args):
    # 需求:用户可以传递任意的值,计算数值的和
    # *args:是一个可变参数
    # args:是元组数据类型
    sum = 0
    for item in args:
        sum += item
    print(sum)
mySum(1,12,34,556,7)

在这里插入图片描述

可变参数练习

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

代码:

def cacluate(*args):
    li = []
    sum = 0
    for i in args:
        sum += i
    avg = sum / len(args)
    for i in args:
        if i > avg:
            li.append(i)
    return avg,li
print(cacluate(1,3,5,4,67,43))

运行结果:
在这里插入图片描述
2.编写一个函数, 接收字符串参数, 返回一个元组,‘hello WROLD’
元组的第一个值为大写字母的个数, 第二个值为小写字母个数.

代码:

def str(args):    
    lower = 0
    upper = 0
    for i in args:
        if i.islower():
            lower += 1
        elif i.isupper():
            upper += 1
    return upper,lower

print(str('hello WORLD'))

运行结果:
在这里插入图片描述
3.编写函数, 接收一个列表(包含30个整型数)和一个整型数k, 返回一个新列表.
函数需求:
----将列对应(不包含k)下标k之前的元素逆序;
----将下标k之后的元素逆序;

代码:

def sort(li,k):
    # 将下标k之前的元素放入li1 
    li1 = li[:k]
    # 将下标k之后的元素放入li2
    li2 = li[k+1:]
    # 将下标k之前元素逆序
    li1.sort(reverse=True)
    #在下标k的位置添加下标k对应的元素
    li1.insert(k,li[k])
    # 将下标k之前元素逆序
    li2.sort(reverse=True)
    li3 = li1 + li2
    return li3
li = list(range(30))
print(sort(li,5))

运行结果:
在这里插入图片描述

关键字参数
def getStuInfo(name,age,**kwargs):	
    # **kwargs:是关键字参数
    # kwargs:字典数据类型
    print(name,age)
    print(kwargs)
getStuInfo('westos',18,hobbies=['code','running'],gender='female')

在这里插入图片描述

对字典进行解包
def getStuInfo(name,age,**kwargs):
    print(name,age,kwargs)
    
d = dict(a=1,b=2)
# *:获取key值
print(*d)
# **:获取字典
getStuInfo('westos',11,**d)

在这里插入图片描述

函数的作用域

作用域:
----局部作用域
----全局作用域

# 全局作用域:函数作用在整个程序
num = 10
def fun():
    # 局部作用域:函数在运行时生效,函数运行结束时则释放
    num = 2
    print(num)	# num = 2
fun()
print(num)	# num = 10

num = 10
def fun():
    # 通过global关键字声明局部变量为全局变量
    global num
    print(num)	# num = 10
fun()
    
num = 10
def fun():
    # 声明局部变量为全局变量,函数执行完毕后,变量依然有效
    global num
    num = 2
fun()
print(num)	# num = 2

参数检测

检测:如果x,y都是整型或浮点型,则返回x+y,否则,提醒报错!

def add(x,y):
    if isinstance(x,(int,float)) and isinstance(y,(int,float)):
        return x+y
    else:
        print('Error')
res = add(2,3)
print(res)

在这里插入图片描述

函数练习

1.平方等式
题目需求:
对于一个十进制的正整数, 定义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):
    # 先把数字转换成为字符串
    n = str(n)
    # 计算字符串中每个数的平方
    sum = 0
    for item in n:
        sum += int(item)**2
    return sum

def isOK(k,n):
    if k * f(n) == n:
        return True
    else:
        return False

def main():
    k = 51
    a = 5000
    b = 10000
    count = 0
    for i in range(a,b+1):
        if isOK(k,i):
            count += 1
    print(count)

main()

方法二:

def f(n):
    n = str(n)
    sum = 0
    for i in n:
        sum = sum + int(i) ** 2
    return sum
    
# 1.接收变量k,a,b
s = input('请输入三个正整数(k,a,b):')
# 存储整型k,a,b 
li = []
for i in s.split():
    li.append(int(i))
k,a,b=li

# 2.进行判断是否满足条件
count = 0
for i in range(a,b+1):
    if k*f(i)==i:
        count += 1
print(count)

运行结果:
在这里插入图片描述

2.Collatz序列
编写一个名为collatz()的函数,它有一个名为number的参数;
----如果参数是偶数,那么collatz()就打印出number//2,并返回该值;
----如果number是奇数,collatz()就打印并返回3*number+1;

然后编写一个程序,让用户输入一个整数,并不断对这个数调用collatz(),直到函数返回值为1(令人惊奇的是,这个序列对于任何整数都有效,利用这个序列,你迟早会得到1!既使数学家也不能确定为什么。你的程序在研究所谓的“Collatz序列”,
它有时候被称为“最简单的、不可能的数学问题”)。
输入:
3
输出:
10
5
16
8
4
2
1
代码:
方法一:

def collatz(number):
    if number % 2 == 0:
        return number // 2
    else:
        return number * 3 + 1
        
num = int(input('输入一个数:'))
while num !=1:
    num = collatz(num)
    print(num)

方法二:

def collatz(number):
    if number == 1:
        exit(0)
    elif number % 2 == 0:
        return number // 2
    else:
        return 3 * number + 1

num = int(input('输入一个数:'))
while True:
    num = collatz(num)
    print(num)

运行结果:
在这里插入图片描述
3.编写函数,计算字符串匹配的准确率

代码:

def rate(x,y):
    if not (isinstance(x,str) and isinstance(y,str)):
        print('Error!')
        return
    if len(x) < len(y):
        print('Error!')
        return
    right = 0
    for a,b in zip(x,y):
        if a == b:
            right += 1

    return right/len(x)

s1 = 'have a nice day'
s2 = 'have a good day'
s1 = ''.join(s1.split())
s2 = ''.join(s2.split())
print(rate(s1,s2))

运行结果:
在这里插入图片描述
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之间的随机数
    number = random.random()
    # 判断随机转盘转的数是几等奖?
    for k, v in rewardDict.items():
    # 这里的v是元组
        if v[0] <= number < 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)

运行结果:
在这里插入图片描述

列表生成式

列表生成式:

[experssion for item in 序列 if 判断语句]

1.接收变量k,a,b

s = '51 5000 10000'

# for循环
li = []
for item in s.split():
    li.append(int(item))
k,a,b = li
print(k,a,b)

# 列表生成式
k,a,b=[int(item) for item in s.split()]
print(k,a,b)

在这里插入图片描述
2.生成一个列表,列表元素分别为[1 ** 1 , 2 ** 2 , 3 ** 3 , 4 ** 4 , … , n ** n]

# for循环
li = []
for i in range(1,8):
    li.append(i**i)
print(li)

# 列表生成式
li = [i**i for i in range(1,8)]
print(li)

在这里插入图片描述
3.生成一个列表,列表元素为偶数的平方次幂

li = [i ** 2 for i in range(1, 8) if i % 2 == 0]
print(li)

在这里插入图片描述

列表生成式变形之for循环嵌套

将3x3的矩阵转换成一堆数组
[
[1,2,3],
[4,5,6],
[7,8,9]
]
输出:
[1,2,3,4,5,6,7,8,9]

 li = [
    [1,2,3],
    [4,5,6],
    [7,8,9]
]

#方法一:for循环
resLi = []
for item1 in li:
    for item2 in item1:
        resLi.append(item2)
print(resLi)

#方法二:列表生成式
print([item2 for item1 in li for item2 in item1])

#方法三:导入模块
from itertools import chain
print(list(chain(*li)))

在这里插入图片描述

列表生成式案例

将列表中所有内容都变成小写

li = ['kshfoiauIUHENIWU','ISCIUJWlkdjsa']
print([i.lower() for i in li])

在这里插入图片描述
找出/var/log目录中,所有以.log结尾的文件名或目录名

import os

print(os.listdir('/var/log'))
print([i for i in os.listdir('/var/log') if i.endswith('.log')])

在这里插入图片描述

列表生成式练习

1.找出1~10之间的所有偶数

代码:

li = [i for i in range(1,10) if i%2==0]
print(li)

运行结果:
在这里插入图片描述
2.找出1~100之间所有的质数

分析:
-判断:num是否为质数,如果是质数,返回True,否则返回False
-质数:只能被1和本身整除的数,就是质数
-方法:
----依次判断num能被(2,num)整除
----如果能被其中其中一个数整除,不是质数
----当循环结束,都没有发现能被整除的数,那么就是质数

代码:

def isPrime(num):
    for item in range(2,num):
        if num%item==0:
            return False
    else:
        return True
li = [i for i in range(2,101) if isPrime(i)]
print(li)

运行结果:
在这里插入图片描述
3.输入:
s1=‘ABC’
s2=‘123’
输出:
‘A1’, ‘A2’, ‘A3’, ‘B1’, ‘B2’, ‘B3’, ‘C1’, ‘C2’, ‘C3’
‘A1’ ‘B2’ ‘C3’

代码:

s1 = 'ABC'
s2 = '123'

# 'A1' 'B2' 'C3'
li = [''.join(i) for i in zip(s1,s2)]
print(li)

# 'A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3'
print([i + j for i in 'ABC' for j in '123'])

运行结果:
在这里插入图片描述
4.找出1~10之间所有偶数, 并且返回一个列表,(包含以这个偶数为半径的圆的面积)

代码:

import math

# 方法一:
li = []
for r in range(2, 11, 2):
    square = math.pi * r * r
    li.append(square)
print(li)

# 方法二:
print([math.pi * r * r for r in range(2, 11, 2)])

# 方法三:
def square(r):
    # 求以r为半径的圆
    res = math.pi *r*r
    return res
print([square(r) for r in range(2,11,2)])

运行结果:
在这里插入图片描述
5.给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如:输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
[2,3,5,7]

输入描述:
输入包括一个整数n,(3 ≤ n < 1000)

输出描述:
输出对数

示例1 :
输入:
10
输出:
2

代码:

n = int(input('请输入一个整数(3<=n<1000):'))
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,n+1) if isPrime(i)]

# 方法一:
count = 0
for i in primeLi:
    for j in primeLi:
        if n == i + j and i <= j:
            print([i,j])
            count += 1
print(count)

# 方法二:
count = [(i,n-i) for i in primeLi if n-i in primeLi and i<=n-i]
print(len(count))

运行结果:
在这里插入图片描述

字典生成式

需求1:假设有20个学生,学生分数在60~100之间,筛选出成绩在90分以上的学生

import random

#for循环
stuInfo={}
for i in range(20):
    name = 'westos' + str(i)
    score = random.randint(60,100)
    stuInfo[name] = score
print(stuInfo)
#字典生成式
stuInfo = {'westos'+ str(i):random.randint(60,100) for i in range(20)}
print(stuInfo)

#for循环
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})

在这里插入图片描述
需求2:将所有的key值变为大写

d = dict(a=1, b=2)

#for循环
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=5)

#for循环
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})

在这里插入图片描述

集合生成式

与列表生成式类似

print({i ** 2 for i in {1, 2, 3}})
print({i ** 2 for i in {1, 2, 3, 9, 12} if i % 3 == 0})
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值