函数的应用

#函数练习
'''
对于一个十进制的正整数,定义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):      #定义一个函数
    back = 0   #返回值初始值附为0
    for item in str(n): # 遍历整个字符串的所有单个元素
        back +=int(item)**2
    return back

def isOk(k,n):     #判断是否满足k*f(n)=n这个条件
    if k * f(n) == n:
        return True
    else:
        return False
def main():        #定义主函数
    k=51
    a=5000
    b=10000
    count=0        #初始数量为0
    for i in range(a,b+1):
        if isOk(k,i):
            count +=1
    print(count)
main()       #执行主函数

#作用域:
#全局作用域:作用于整个脚本
#局部作用域:在函数运行时生效,函数运行结束则释放
num=10
print('out fun : id=',id(num))

def fun():
    #局部作用域
    num=2
    print('in fun:id=',id(num))
    print('in fun:num=',id(num))   #当函数执行结束,变量num的值2被释放掉
fun()
print('out fun:num=%s'%(num))

#global关键字
num=10
def fun():
    global num      #通过global关键字声明局部变量成为全局变量,让函数执行结束,2依然生效
    num = 2
fun()
print(num)


#函数练习
'''
1.Collatz序列
编写一个名为collatz()的函数,它有一个名为number的参数。
如果参数是偶数,那么collatz()就打印出number//2,并返回
该值。如果number是奇数,collatz()就打印并返回3*number+1。
然后编写一个程序,让用户输入一个整数,并不断对这个数
调用collatz(),直到函数返回值1(令人惊奇的是,这个序列
对于任何整数都有效,利用这个序列,你迟早会得到1!既使数学
家也不能确定为什么。你的程序在研究所谓的“Collatz序列”,
它有时候被称为“最简单的、不可能的数学问题”)。
'''
def collatz(number):
    if number %2==0:   #判断是否为偶数
        return number//2
    else:
        return 3*number+1
def main():
    num=int(input('数字:'))
    while True:
        if collatz(num)==1:
            print(1)
            break
        else:
            num=collatz(num)
            print(num)
main()


#参数检测
print(isinstance(1,int))         #True
isinstance(1.0,float)            #True

#函数参数的顺序
#(必选参数,默认参数,可变参数,关键字参数)
def fun(num1,num2=3,*args,**kwargs):
    pass

#参数易错点
#定义函数,默认参数的默认值尽量不是可变参数;
def fun(li=[]):
    li.append('hello')
    return li
print(fun())

#迭代
#iterable:可迭代的,即也就是可以 for循环的
# s='hello'
# for (int i=0,i<length(s);i++)
from collections import Iterable
isinstance(1,int)
print(isinstance(1,Iterable))
print(isinstance({1,2,3},Iterable))
print(reversed([1,2,3,4]))   #<list_reverseiterator object at 0x10fb45eb8>


#列表生成式
import random
li = []
for i in range (10):
    li.append(random.randint(1,10))
print(li)
##普通的列表生成式:
print([random.randint(1,10) for i in range(10)])
print([i*i for i in range(8)])
#升级版本
#1,找出1~10之间所有的偶数
print([i for i in range(1,11) if i%2==0])
#2.找出1~1000之间所有的质数
def isPrime(num):
    for j in range(2,num):
        if num%j==0 :     #判断是否为质数
            return False
    else:
        return isPrime
print([i for i in range(1,1001) if isPrime(i)])
#3.for 嵌套for 循环
print([i+j for i in "ABC" for j in '123'])


#列表生成式练习
#1。将列表中的所有内容都变为小写:
li=['HEllo','XiaoMi']
print([i.lower() for i in li ])      #['hello', 'xiaomi']
#2.找出/var/log/目录中,所有以.log结尾的文件名或者目录名;
import os
print([filename for filename in os.listdir('/var/log') if filename.endswith('.log')])

#字典生成式
d = dict(a=1,b=2)
print('小写的字典:',d)
##1.需求1:将所有的key值变为大写:
#1-1。传统方法;
new_d={}
for i in d:     #'a','b'
    new_d[i.upper()]=d[i]
print('key转化为大写的字典:',new_d)
#1-2.升级后的;
print({k.upper():v for k,v in d.items()})
##需求2:大小写key值合并,统一以小写key值输出
d=dict(a=2,b=1,c=2,A=5,B=9,C=3)
print({k.lower():d.get(k.lower(),0)+d.get(k.upper(),0) for k in d})
##需求3:把字典的key和value值调换:
d={'a':'1','b':'2'}
print({v:k for k,v in d.items()})
#集合生成式
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 1 2 3 5 8 13 21 34 55 ....
def fib(num):    #定义斐波那契函数
    a,b,count =0,1,1   #a=0,b=1,count=1
    while count <= num:
        print(b)
        a,b=b,a+b    #a=2,b=3
        count +=1
fib(90)

猜你喜欢

转载自blog.csdn.net/xijiao_jiao/article/details/80260184