Linux —— python中函数和生成式的使用

目录

Python中函数(function)的用法

参数:形参和实参

形参

变量:局部变量和全局变量

局部变量

全局变量

生成式

高阶函数

map函数

reduce函数 

filter过滤函数

sorted函数

匿名函数

练习


Python中函数(function)的用法

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
  • 函数内容以冒号起始,并且缩进
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None

参数:形参和实参

形参

位置参数

def getInfo(name,age):
    print(name,age)
getInfo('westos',11)
getInfo(11,'wesots')  # 打印出结果为name=11,age="westos",不符合常理,因此顺序不能颠倒
getInfo(age=11,name='westos')  # 也可以直接对参数name和age直接传值

默认参数

def mypow(x,y=2):   # y=2即为默认参数,有默认参数时,形参和实参数目可以不一致
    print(x**y)     # 打印x的y次方
mypow(4)            # 没有传值使用默认的2
mypow(2,3)          # 传值则使用所传递的数值来运算

可变参数

def mysum(*a):        # 加*号表示传多个参数,不加则默认为一个
    sum = 0
    for item in a:
        sum += item
    print(sum)
mysum(1,2,3,4,5)

关键字参数

def getInfo(name,age,**kwargs)    # **kw[keywords]关键字参数
    print(name,age)
    print(kwargs)
getInfo('westos',18,gender='female',hobbies=['coding','running'])
    

变量:局部变量和全局变量

局部变量

在函数内部定义的变量,只在函数内部起作用,函数执行结束,变量会失效,在函数外访问不到

全局变量

在整个程序中函数内外都可以访问到

a = 1
print('outside:',id(a))
def fun():
    a = 5
    print('inside:',id(a))

fun()
print(a)
print(id(a))

a = 1
print('outside:',id(a))
def fun():
    global a      # 声明为全局变量
    a = 5
    print('inside:',id(a))

fun()
print(a)
print(id(a))

生成式

示例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                    # 通过key值找到value值
# 方式一:
# highScore = {}
# for name,score in stuInfo.items():
#     if score > 90:
#         highScore[name] = score              # 如果score大于90,将其放入highScore字典中
# print(highScore)
# 方式二:
# name:score为需要获取的值,for name,score in stuInfo.items() if score > 90表示获取到的值需要满足的条件
print({name:score for name,score in stuInfo.items() if score > 90})

示例2:

把所有的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}
# # 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})

高阶函数

map函数

map()函数接收两个参数,一个是函数,一个是序列。map将传入的函数依次作用到序列的每个元素,并且把结果作为新的序列返回

练习:10个数在[2,7]中取随机数求阶乘

import random
def f(x):        # 定义阶乘函数
    res = 1
    for i in range(1,x+1):
        res *= i
    return res
# 定义列表生成式
li = [random.randint(2,7) for i in range(10)]    # 在2~7之间产生10个随机数
print(li)
print(list(map(f,li)))

reduce函数 

reduce:把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

reduce(f,[x1,x2,x3,x4,x5]) = f(f(f(x1,x2),x3),x4)

python2中为内置函数;

python3通过:from functools import reduce 将其导入 

# 相当于做累乘、累加操作
from functools import reduce
def multi(x,y):
    return x * y

print(reduce(multi,range(1,4)))

def add(x,y):
    return x + y
print(reduce(add,[1,2,3,4,5]))

filter过滤函数

和map()类似,也接收一个函数和一个序列。但是和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素

# 判断(0,100)中的偶数
def isOdd(num):
    if num % 2 == 0:
        return True
    else:
        return False
print(list(filter(isOdd,range(100))))

# 判断1~100中的质数
def isPrime(num):
    for i in range(2,num):
        if num % i == 0:
            return False
    else:
        return True
print(list(filter(isPrime,range(1,100))))

sorted函数

# li = [2,3,1,4]
# li.sort()           # 顺序排序
# print(li)

# li.sort(reverse=True) # 逆序排序
# print(li)

# print(sorted(li))                   # 顺序排序
# print(sorted(li,reverse=True))      # 逆序排序

练习:

info = {
    # 商品名称    商品数量    商品价格
    ('apple1',200,32),
    ('apple4',40,12),
    ('apple3',40,2),
    ('apple2',1000,23),
    ('apple5',40,5)
}
print(sorted(info))        # 按照商品名称排序

def sort_by_num(num):      # 按照商品数量排序
    return num[1]
print(sorted(info,key=sort_by_num))

def sort_by_price(x):      # 按照商品价格排序
    return x[2]
print(sorted(info,key=sort_by_price))

def sort_by_count_price(y):    # 先按商品数量排序,数量相同时,按照价格排序
    return y[1],y[2]
print(sorted(info,key=sort_by_count_price))

匿名函数

匿名函数关键字是lambda,冒号前面是形参,冒号后面是返回值

from functools import reduce
# def fun(*args,**kwargs):
#     return args,kwargs
# print(fun([1,2,3,4,5]))

# print(lambda *args,**kwargs:(args,kwargs))

# def add(x,y):
#     return x+y
# print(reduce(lambda x,y:x+y,[1,2,3,4,5]))

# def mypow(x):
#     return x ** 2
# print(map(lambda x:x ** 2,range(5)))
print(list(filter(lambda x:x%2==0,range(100))))

####练习:移动数组中的0
nums = [0, 7, 0, 1, 2, 1, 5,1,  7, 8, 0, 67, 1, 3, 4]

print(sorted(nums,key=lambda x:1 if x == 0 else 0))

练习

示例1: 

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

def cacluate(*args):
    avg = sum(args) / len(args)
    more_avg = []
    for item in args:
        if item > avg:
            more_avg.append(item)
    return avg,more_avg
a = cacluate(1,2,3,4,5,6,7,8)
print(a)

示例2:

编写一个函数,接收字符串参数,返回一个元组,'ehllo WROLD',元组的第一个值为大写字母的个数,第二个值为小写字母个数

def letterNum(x):
    upper_letter_count = 0
    lower_letter_count = 0
    for i in x:
        if i.isupper():     # 如果该条件为真
            upper_letter_count += 1
        elif i.islower():
            lower_letter_count += 1
        else:
            continue
    return upper_letter_count,lower_letter_count
a = letterNum('ehllo WROLD')
print(a)

示例3:

编写函数,接收一个列表(包含29个1~100之间的随机整型数)和一个整型数k,返回一个新列表.
函数需求:
    - 将列表下标k之前对应(不包含k)的元素逆序;
    - 将下标k及以后的元素逆序;
[0,2,3,4,5]  2   [2,0,5,4,3]

def fun(li,k):
    print(li)
    if k < 0 or k > len(li):        # 首先先判断k是否存在
         return 'error k'
    return li[:k][::-1] + li[k:][::-1]
print(fun([0,2,3,4,5],2))

示例4:

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

import random
# 创建一个字典保存对应关系
rewardDict = {
    '一等奖' : (0,0.08),
    '二等奖' : (0.08,0.3),
    '三等奖' : (0.3,1)
}
def lottery():                       # 判断用户在哪个得奖区间
    num = random.random()
    for k,v in rewardDict.items():
        if v[0] <= num < v[1]:
            return k
resultDict = {}
for i in range(1000):                # 统计得奖人数
    res  = lottery()
    if res not in resultDict:        # 第一次出现,就只有1
        resultDict[res] = 1
    else:
        resultDict[res] += 1         # 不是第一次出现,直接+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):            # 定义f(n)为其各位数字的平方和
    n = str(n)       # 转换为字符串
    sum = 0
    for item in n:   # 要求和,这里就需要创建一个累加器
        sum += int(item) ** 2   # 先将item转换为int型再进行平方操作
    return sum
# print(f(13))
s = input()
li = []
for item in s.split():
    li.append(int(item))          # 保存三个整型数
k,a,b = li
count = 0
for i in range(a,b+1):
    if k * f(i) == i:
        count += 1

print(count)

示例6: 

 - 题目描述:
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,>并输出结果。输
入值小于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
# 将所有的质数放在list中
primeList = [i for i in range(2,num) if isPrime(i)]
print(primeList)                                        # 打印所有质数
count = 0                                               # 创建一个计数器
# [2,3,5,7] 3+7 5+5 7+3(重复)
for item in primeList:                                  # 遍历质数列表
    if (num - item) in primeList and item <= num - item:     #item <= num - item,来保证不重复
        count += 1
# 寻找相加等于(item1 + item2) = num
print(count)

示例7:

给定一个整形数组, 将数组中所有的0移动到末尾, 非0项保持不变;
在原始数组上进行移动操作, 勿创建新的数组;
# 输入:
    第一行是数组长度, 后续每一行是数组的一条记录;
    4
    0
    7
    0
    2
# 输出:
    调整后数组的内容;
    4
    7
    2
    0
    0 

n = ''.join(input().split())
li = [int(i) for i in n]
# 排序
def move_zero(x):
    if x == 0:                  # 将列表中每一项都传入和执行排序操作
        return 2
    else:
        return 1
print(sorted(li,key=move_zero))

示例8:

如何快速生成验证码,内推码
import random
import string

code_str = string.ascii_letters + string.digits
# print(code_str)

def gen_code(len=4):
    # code = ''
    # for i in range(len):
    #     new_s = random.choice(code_str)
    #     code += new_s
    # print(code)
    return ''.join(random.sample(code_str,len))

# a = gen_code()
# print(a)

print([gen_code(len=6) for i in range(100)])
print(random.sample(code_str,2))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值