一.Python下的函数

1.函数:将重复的代码放入函数中

2.函数的定义

def   函数名():

       代码

3.函数的调用:通过函数名()即可完成函数的调用

def   say_hello():
       print('hello')
say_hello()            #定义一个函数,并不会执行,除非调用该函数。输出hello

4.函数里嵌套函数

def   redhat():
      print('is redhat')
      def   python():
          print('is python')
      python()
redhat()                         #输出is redhat

                                                is  python

值得注意的是:只调用redhat这个函数的话,不会输出'is  python'。想要输出'is  python',就必须在里面调用python这个函数

5.函数的参数:

<1>参数:实参和形参

定义函数的时候的变量叫形参(前面不需要定义)。形参的名字可以任意给定。

def   welcome(a):
      print('hello',a)
真实的数据信息,调用函数的时候传的参数叫做实参。
welcome('lily')          #输出hello lily
welcome('xin')     

<2>形参:位置参数,默认参数,可变参数,关键字参数

(1)位置参数

def   getInfo(name,age):
      print(name,age)
getInfo('redhat',11)                        #输出redhat  11
getInfo(11,'redhat')                        #输出11  redhat
getInfo(age=11,name='redhat')   #输出redhat  11

(2)默认参数

(1)形参和实参可以不一致

def   mypow(x,y=4):
    print(x**y)
mypow(2)            #输出16
mypow(2,3)         #输出8,当实参和形参不一致时,以实参为准

(2)默认参数要写在最后。(即顺序是有要求的。)

def   mypow(y=4,x):
    print(x**y)
mypow(x=2)            #输出会报错
mypow(2,x=3)         #输出会报错

(3)默认参数可以有多个

def   mypow(x,y=3,z=4):
      print(x+y+z)
mypow(2)             #输出9
mypow(2,5)         #输出11,可以写y=3,也可以直接写3。因为顺序已经指定好了(但如果参数的顺序没有指定好的时候,参数的名字就不能年损裂(比如“print”这个函数))

(3)可变参数(*args——表示没有名字的多个参数,也可以不叫args,叫其他名字,但是一般叫args)

def mysum(*args):
    """
    :param args:
    :return:
    *a:可变参数
    a:是元组数据类型
    """
    sum = 0
    for item in args:
        sum += item
    print(sum)
mysum(1,2,3,4,5,6,7,8,9)               #输出45

(4)关键字参数(**kwargs——表示有名字的多个参数)

def getStuInfo(name,age,**kwargs):
    """
    **kwargs是一个字典,可以传递任意多的key-value
    :param name:
    :param age:
    :param kwargs:
    :return:
    """
    print(name,age)
    print(kwargs)

getStuInfo('westos','19',hobbies=['coding','running'],gender='female')
#输出westos 19
#输出{'hobbies': ['coding', 'running'], 'gender': 'female'}

 

 

也可以利用下面的列表或者元组(其实args打印出来的是元组,而非列表),字典进行传参。

def test(x,*args,**kwargs):
    print(x)
    print(args)
    print(kwargs)
    sum=x
    for i in args:
        sum+=i
    for i in kwargs.values():
        sum+=i
    print('和为%s' %sum)

nums=[3,4]
nums2={'num1':5,'num2':6}
test(2,*nums,**nums2)
#输出2
#输出(3, 4)
#输出{'num1': 5, 'num2': 6}
#输出和为20

6.函数的返回值

返回值:函数运行的结果,还需要进一步操作时,给一个返回值
return用来返回函数执行结果,如果没有返回值,默认为None
python可以间接返回多个值(返回了一个元组)
一旦遇到return,函数执行结束,后面的代码不会执行

def   mypow(x,y=2):
    return x ** y,x +y
    print('hello')

a,b = mypow(3,4)
print(a,b)                 #输出81  7

 

 

def mypow(x,y=2):
    print(x ** y)

a = mypow(2)         #输出4
print(a)                    #输出None,这是因为函数没有返回值,所以输出为None

使用多个变量来接收返回值
def test1():
    a=1
    b=2
    return a,b
x,y=test1()
print(x,y)        #输出1 2

使用一个变量(元组)来返回多个值

def test1():
    a=1
    b=2
    return a,b
x=test1()
print(x)          #输出(1,2)

使用一个变量(列表)来返回多个值

def test1():
    a=1
    b=2
    return [a,b]
x=test1()
print(x)        #输出[1,2]

7.局部变量和全局变量

(1)局部变量:在函数内部定义的变量,只在函数内部起作用,函数执行结束,变量会自动删除。
def   test1():
     a=200
     print('a的值为%s' %a)
 test1()           #输出a的值为200 
def   test1():
     a=200
     a+=1
     print('a的值为%s' %a)
 test1()           #输出a的值为201 
下面的程序出错(因为在打印之前函数没有被调用)
 def test1():
    a=200
    a+=1
    print('a的值为%s' %a)
print(a)          
 test1() 
下面的程序出错(因为变量是局部变量,只在函数内部生效)
下面的程序表明,在函数中定义一个变量,默认是局部变量。
def test1():
     a=200                  #局部变量只能在该函数中使用(它的作用范围在改函数内部)
     a+=1
     print('a的值为%s' %a)
 test1()
 print(a) 
想要在函数中定义全局变量,就必须加关键字"global"
def test1():
     global a                #声明函数中定义的变量a为全局变量。
     a=200                  #局部变量只能在该函数中使用(它的作用范围在改函数内部)
     a+=1
     print('a的值为%s' %a)
 test1()               #输出a的值为201
 print(a)              #输出201(2)全局变量:在函数外面定义的变量叫做全局变量
a=400                    #全局变量,可以在后面的代码中使用。
 def test1():
     a=200
     print('a的值为%s' %a)
 def test2():
     a=300
     print('test2函数中a的值为%s' %a)
 test1()         #输出“a的值为200”
 test2()         #输出“test2函数中a的值为300”
 print(a)        #输出“400” 
 
下面的代码表明,在前面定义了全局变量的话,在函数里面也可以使用全局变量
a = 1
 print('outside:',id(a))             #id(变量名):用来查看变量的内存地址def fun():
     global a              #声明全局变量
     a = 5
     print('inside:',id(a))fun()
 print(a)
 print(id(a))
 #输出 outside: 9334784
 #输出 inside: 9334912
 #输出 5
 #输出 9334912 
 
def fun():
     # global a             #这行代码注释
     a = 5                       #定义局部变量a
     print('inside:',id(a))fun()
 print(a)
 print(id(a))
 #输出 outside: 9334784
 #输出 inside: 9334912
 #输出 1
 #输出 9334784

二.Python下函数的练习

1.练习一:

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

def calculate(*args):
    # 求平均数
    avg=sum(args)/len(args)
    # 定义一个空列表,用于存放大于平均数的值
    l = []
    #求大于平均值的数,并将其加到l列表中
    for j in args:
        if j>avg:
            l.append(j)
    return avg,l
print(calculate(2,3,4,5,6,7))

2.练习二:

**案例2:
  编写一个函数, 接收字符串参数, 返回一个元组。
  元组的第一个值为大写字母的个数, 第二个值为小写字母个数.

def str_upper_lower(a):
    upper_count,lower_count=0
    for i in a:
        if i.isupper():
            upper_count+=1
        elif i.islower():
            lower_count+=1
    return upper_count,lower_count
print(str_upper_lower(input('请输入一个字符串:')))

3.练习三:

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

import random
def reverse_list(l,k):
    if k<0 or k>len(l):
        return 'error k'
    return l[:k][::-1]+l[k:][::-1]
#定义一个空列表l1,用来存放随机产生的30个数
l1=[]
for j in range(30):
    l1.append(random.randint(1,100) )
print(l1)
print(reverse_list(l1,2))

4.练习四:

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

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

import random
#定义一个字典,用来存放数据
d={}.fromkeys({'一等奖','二等奖','三等奖'},0)
# d={'一等奖':0,'二等奖':0,'三等奖':0}

def prize():
    num = random.random()
    if num > 0 and num < 0.08:
        d['一等奖'] += 1
    elif num >= 0.08 and num < 0.3:
        d['二等奖'] += 1
    elif num >= 0.3 and num < 1:
        d['三等奖'] += 1
for i in range(1000):
    prize()
print(d)

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):
    #1.先把数字转换为字符串
    n=str(n)
    #2.计算字符串中每个数字的平方和
    sum=0
    for item in n:
        sum+=int(item)**2
    return sum

#1.接收变量k,a,b
s=input()
#2.存储整型k,a,b
li=[]
for item in s.split():
    li.append(int(item))

k,a,b=li

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

三.集合推导式

print({i**2 for i in {1,2,3,3}})                                    #输出{1, 4, 9}
print({i**2 for i in {1,2,3,9,12,9} if i%3==0})          #输出{81, 9, 144}

总结:

{表达式   for  i  in  range序列  if...}。其中if...是可以损裂的。

四.列表推导式

1.列表推导式的基本格式

li=[]
for i in range(1,9):
    li.append(i**2)
print(li)           #输出[1, 4, 9, 16, 25, 36, 49, 64]

print([i**2 for i in range(1,9)])       #输出[1, 4, 9, 16, 25, 36, 49, 64]

总结:

[表达式   for  i  in  range序列  if...]。其中if...是可以损裂的。

2.列表推导式的练习

<1>练习一:求圆的面积

#1.找出1-10之间的所有偶数,
# 并返回一个列表(包含以这个偶数为半径的圆的面积)

import math
print([math.pi *r *r for r in range(1,11) if r%2==0])
#输出[12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676, 314.1592653589793]

或

import math
print([math.pi *r *r for r in range(2,11,2)])
#输出[12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676, 314.1592653589793]

值的注意的是,要导入math这个模块,派的输出为math.pi。

<2>练习二:求取质数

#2.找出1~100之间所有的质数

def func(n):
    for i in range(2,n):
        if n%i==0:
            return False
    else:
        return True
print([i for i in range(2,101) if func(i)])

<3>练习三:求取质数对

(2018-腾讯-在线编程题)
- 题目描述:
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整
数,并输出结果。输
入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别
为(5,5),(3,7))
# [2,3,5,7]
- 输入描述:
输入包括一个整数n,(3 ≤ n < 1000)
- 输出描述:
输出对数
- 示例1 :
```
输入:
    10
输出:
    2
"""

def isPrime(n):
    for i in range(2,n):
        if n%i==0:
            return False
    return True

num=int(input())

prime_li=[i for i in range(2,num) if isPrime(i)]

prime_count=0
for j in prime_li:
    if (num-j) in prime_li and j<=num-j:
        prime_count+=1
print(prime_count)

五.字典推导式

1.字典推导式的基本格式

d=dict(a=1,b=2)
print(d)         #输出{'a': 1, 'b': 2}

new_d={}
for i in d:
    new_d[i.upper()]=d[i]

print(new_d)     #输出{'A': 1, 'B': 2}


d=dict(a=1,b=2)
print({k.upper():v for k,v in d.items()})      #输出{'A': 1, 'B': 2}

总结:

[键:值    for  k,v  in  字典.items   if...]。其中if...是可以损裂的。

2.字典推导式的练习

<1>练习一:

d = dict(a=2,b=1,c=2,B=9,A=10)
#输出{'a':12,'b':10,'c':2}

d={'a':2,'b':1,'c':2,'B':9,'A':10}
new_d={}
for k,v in d.items():
    if k.lower() in new_d:
        new_d[k.lower()]+=v
    else:
        new_d[k.lower()]=v

print(new_d)             #输出{'a': 12, 'b': 10, 'c': 2}



或


d={'a':2,'b':1,'c':2,'B':9,'A':10}
print({k.lower():d.get(k.lower(),0)+d.get(k.upper(),0) for k,v in d.items()})
#输出{'a': 12, 'b': 10, 'c': 2}

六.高阶函数

1.高阶函数的介绍

高阶函数
    实参是一个函数名
    函数的返回值也是一个函数

def   fun(x,y,f):
    return   f(x),f(y)

print(fun(-10,-20,abs))            #输出(10, 20)

函数本身也可以赋值给变量,变量也可以指向函数

f=abs
print(f(-10))          #输出10

2.python3.6内置的高阶函数

<1>map函数

(1)map函数简介

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

所以:自己定义的函数必须有一个形参

(2)map函数练习

练习一:

对于序列[-1,3,-5,-4]的每个元素求绝对值

print(map(abs,[-1,3,5,-4]))         #输出类
#想要变成列表,需要转换
print(list(map(abs,[-1,3,5,-4])))         #输出[1, 3, 5, 4]

练习二:

对于序列的每个元素求阶乘(10个,2~7之间的随机)

#方法一:
import random
def jc(n):
    result = 1
    for i in range(1,n+1):
        result*=i
    return result
l=[]
for i in range(10):
    l.append(random.randint(2,7))
print(l)
print(list(map(jc,l)))



#方法二:
import random
import math
l=[]
for i in range(10):
    l.append(random.randint(2,7))
print(list(map(math.factorial,l)))

值的注意的是,要导入math这个模块,求阶乘这个函数为:math.factorial()。

<2>reduce函数

reduce:把一个函数作用在一个序列(list,tuple,set集合)上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素累计计算。
reduce(f,[x1,x2,x3,x4,x5]) = f(f(f(f(x1,x2),x3),x4),x5)

所以:自己定义的函数必须有两个形参

 

from functools import reduce

def multi(x,y):
    return x*y

print(reduce(multi,range(1,4)))         #输出6

 

def add(x,y):
    return x+y

print(reduce(add,[1,2,3,4,5]))          #输出15

值的注意的是:要使用reduce这个函数,必须从functools中导入reduce函数

<3>filter函数

(1)filter函数介绍

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

所以:自己定义的函数必须有一个形参

(2)filter函数练习

练习一:输出0-10之间的偶数

def isodd(num):
    if num%2==0:
        return True
    else:
        return False

print(filter(isodd,range(10)))       #输出类
#想要编程列表,必须转换
print(list(filter(isodd,range(10))))       #输出[0,2,4,6,8]

练习二:输出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(2,101))))