如何在Python中定义函数及实例

函数的定义即调用

函数是封装起来的代码功能。定义时使用 def
在使用函数时需要先调用,才可以使用。

def hello():    # 函数的定义
    print('hello1')
    print('hello2')
    print('hello3')
hello()        # 函数的调用,直接输函数名

在这里插入图片描述

def add():
    num1 = 20
    num2 = 30
    result = num1 + num2
    print('%d+%d=%d' %(num1,num2,result))
add()     # 调用

在这里插入图片描述

嵌套函数:
在这里插入图片描述
在函数中定义函数时,直接调用外层函数不能调用到嵌套的函数,需要在函数中执行调用才可以:

def westos():
    print('westos')
    def python():
        print('python')
    python()    
westos()

在这里插入图片描述
并且python这个函数在外部是没有被定义的,只有存在在westos函数中。

def welcome(a):             a是形参,用来接收用户输入的内容,
    print('hello',a)

welcome('laoli')            实参,用户输入的是什么,a 就是什么
welcome('woain')

在这里插入图片描述

参数

“”"
参数: 形参 实参
形参:位置参数 默认参数 可变参数 关键字参数
实参: 用户传输的
“”"

位置参数


def getinfo(name,age):    定义参数
    print(name,age)

getinfo('west',11)        定义实参
getinfo(11,'west')
getinfo(11,'west',12)

在这里插入图片描述
可见形参是根据实参位置决定的,这就是位置参数的特点,有些不合理的地方。
我们可以这样写:
在这里插入图片描述

默认参数

pow(x,y)函数可以求出x的y次方
我们定义一个

def mypow(x,y=2):         y=2 就是默认参数,位指定实参y时y默认为2
    print(x**y)

mypow(4)               未指定y
mypow(2,3)			   指定y = 3

在这里插入图片描述
2的3次方等于8没问题

可变函数

def mysum(*a):          *可以接收多个变量,为可变函数
    sum = 0
    for item in a:
        sum += item       这是一个求和器
    print(sum)

mysum(1,2,3,4,5)

在这里插入图片描述

关键字参数

def getinfo(name,age,**kwargs):**kwargs 表示关键字参数,他是一个字典,可以传输任意个键值对。
    print(name,age)
    print(kwargs)

getinfo('westos',11,gender='boy',hobby=['running','coding'])

在这里插入图片描述

返回值

函数的返回值就是函数的运算结果 return 可以返回一个元组。且return下面的命令不执行。
return返回的值可以定义为变量。

def mypow(x,y=2):
    return x ** y, x + y
    print('hello world')           # 不会执行
a,b = mypow(3)       # 把返回值定义为变量
print(a,b) 

在这里插入图片描述

变量的作用域

变量分为局部变量和全局变量。
局部变量:在函数内部定义的变量,只在函数内部起作用,函数执行结束,变量会自动删除
全局变量:始终生效

a = 1
print('outside:',id(a))         id可以查看变量在内存中的存储位置,此时为全局变量

def fun():
    a = 5
    print('inside:',id(a))        此时a为局部变量,函数执行结束变量就不起作用了

fun()
print(a)                            查看a 的值
print(id(a))                       查看a的位置

在这里插入图片描述
在全局变量存储位置和局部变量存储位置不同,最后打印出来的值和全局变量的一致。
如何将局部变量转化为全局你变量: global
在这里插入图片描述
用 global 语句去声明变量,一般不用。

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

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

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

def fun(x):
    upper_count = 0
    lowwer_count =0
    for i in x:
        if i.isupper():
            upper_count += 1
        elif i.islower():
            lowwer_count += 1
        else:
            continue
    return upper_count,lowwer_count
a = fun('hello WORLD')
print(a)

在这里插入图片描述
练习3:

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

def fun(li,k):
    if k< 0 or k> len(li):
        return 'Error k'
    return li[:k][::-1] + li[k:][::-1]            返回值需要打印出来,不然看不到
print(fun([1,2,3,4,5],2))

在这里插入图片描述
练习4:

模拟轮盘抽奖游戏
#轮盘分为三部分: 一等奖, 二等奖和三等奖;
#轮盘转的时候是随机的,
如果范围在[0,0.08)之间,代表一等奖,
如果范围在[0.08,0.3)之间,代表2等奖,
如果范围在[0.3, 1.0)之间,代表3等奖,

模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.

import random

rewardDict = {
    '一等奖': (0,0.08),
    '二等奖': (0.08,0.3),
    '三等奖': (0.3,1)
}

def userfun():
    num = random.random()
    for k,v in rewardDict.items():
        if v[0] <= num < v[1]:
            return k

resultDict = {}

for i in range(1000):
    res = userfun()
    if res not in resultDict:
        resultDict[res] = 1
    else:
        resultDict[res] += 1
for k,v in resultDict.items():
    print(k,'--->',v)

在这里插入图片描述

练习五:

“”"
腾讯笔试编程题:
题目需求:
对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
f(13) = 12 + 32 = 10
f(207) = 22 + 02 + 72 = 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 “”"

#定义f(n)
def f(n):
    n = str(n)
    sum = 0
    for item in n:
        sum += int(item) ** 2
    return sum

#建立数值列表
s = input('Input your number')
li = []

for item in s.split():
    li.append(int(item))       #把用户输入的数字转换为整型

#求解
k,a,b = li
list = []           # 用于查看具体数字
count = 0
for n in range(a,b+1):
    if k*f(n) == n:    #条件
        list.append(n)
        count += 1
print(count)
print(list)

在这里插入图片描述

生成式

用法:

[expression for i in seq if...]
s = '51 500 1000'
li = []
for item in s.split():
    li.append(int(item))
print(li)
k,a,b = li
print(k,a,b)

在这里插入图片描述
或者生成式的方法:

s = '51 500 1000'
k,a,b = [int(item) for item in s.split()]
print(k,a,b)

在这里插入图片描述

#1       普通方法生成数字的平方的列表
li = []
for i in range(1,11):
    li.append(i**2)
print(li)
#2
print([i**2 for i in range(1,11)])    生成式方法
print([i**2 for i in range(1,11) if i %2 == 0])     求出偶数的

在这里插入图片描述
l练习:
找出1到100之间的质数:

#先定义函数,在生成式中调用
def isPrime(num):
    for n in range(2,num):
        if num % n == 0:
            return False
    else:
        return True
# 写生成式        
print([i for i in range(2,101) if isPrime(i)])          上面的 num 等于这个 i

在这里插入图片描述

练习2:

(2018-腾讯-在线编程题)

  • 题目描述: 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,>并输出结果。输 入值小于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
primeli = [i for i in range(2,num) if isPrime(i)]
print(primeli)

primelicount = 0
for item in primeli:
    if (num - item) in primeli and item <= (num - item):
        primelicount += 1

print(primelicount)

在这里插入图片描述
5+5=10
3+7=10
在这里插入图片描述
3+17=20
17+3=20

练习3:

需求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

#原始方式:
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})

在这里插入图片描述

需求二.key --> upper 把所有的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}

d = dict(a=2, b=1, c=2, B=9, A=10)

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})
用get函数获取大小学key的value值并相加。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值