20210619 py函数 (复习)

20210619 start

接下来

找一个合适的小白辅助教材

复习内容

牛客网

函数

定义函数

def 函数名():

具体干啥

def 函数名(): ————带返回值的函数

具体干啥

return 返回值——注意这里返回值是没有括号的,而且是缩进了。

案例 输出一个计算式(-8+22)×a-10+c÷2的结果,a=40,c=212 比如

思路20210618 复习到定义函数 突然想起来 这其实是个函数调用题

代码

def jisuan(a,c):

    s=(-8+22)*a-10+c/2

    return int(s)

s=jisuan(40,212)

print(s)

思路 以前——想直接用print 打出结果,但是不知道print复杂语法

网友代码

a=40

c=212

print(eval('(-8+22)*a-10+c//2') )——eval里是否加括号和''?

收获

print( eval(' 计算式'))

变量作用域问题

全局变量

代码1

def test():

    print (string)

string = '小象学院'

test()

结果1

小象学院

代码2

def test():

    print (string)

test()

string = '小象学院'

结果2

报错 NameError: name 'string' is not defined

代码3

string = '小象学院'

def test():

    print (string)

test()

结果3

小象学院

初步结论

在函数外定义的变量,只要在函数最终调用前 定义,都能被函数调用。——

但是 如果不小心定义了和函数里一样的 变量名,那岂不是很糟糕?

——因为不是说函数 会封装好吗? 那外部的变量名 和函数里的名称 碰巧一样,不是冲突了吗

初步结论的解决——调用的时候,如果全局变量和内部变量名称冲突,还是优先内部变量(或者说内部变量的优先级高>于全局变量,内部函数调用还是先看内部赋值)

代码4

string='外部全局'

def t():

    string='函数内部变量'

    print(string)

t()

print(string)

结果4—— 也就是调用的时候,如果全局变量和内部变量名称冲突,还是优先内部变量

函数内部变量

外部全局

!!外部全局变量 global 变量名

代码5

string='外部全局'

def t():

    string='函数内部变量'

    print(string)

t()

print(string)

def pt():

    global string————————声明了global变量之后,前面的全局变量才失效

    string='lize test'

    print(string)

pt()

print(string)

结果5

函数内部变量

外部全局

lize test

lize test

py自带函数——内建函数(官网)https://docs.python.org/zh-cn/3/library/functions.html

sorted()      ——list2=sorted(list1)——从低到高

max()

min()

都是有返回值的这几个

函数练习

case1 累加和——到某个end为止

很久以前的思路—— for自带自动+1

def calculate_sum(number):

    a = 0

    for i in range(number+1):

        a = a + i

    return a

# 补充以下四行代码,分别求100以内的累加和和200以内的累加和,并分别打印出。

print(calculate_sum(100))

print(calculate_sum(200))

20210619思路——while 配合计数器

def sumjia(a):

    s=0

    i=1

    while i <=a:

        s=s+i

        i=i+1

    return s

end=int(input('end num is\n'))

print(sumjia(end))

case2 low到high几位数,没有重复的3位数

20210619思路——三层(因为三位数)循环遍历——注意跳出

def thr(low,high):

    for i in range(low,high+1):

        for j in range(low,high+1):

            for k in range(low,high+1):

                while i!=j and i!=k and j!=k:

                    print(i*100+j*10+k)

                    break——break跳出很重要,continue还不行?为啥,不是特别懂

thr(2,5)

case3 在范围内猜数字

20210617思路——不断逼近——break用法强化理解

def guess(right,a,b):

    while True:

        print('num is {} to {}'.format(a,b))

        youinp=int(input('now guess\n'))

        if youinp==right:

            print('bingo!!!')

            break—— break这里直接从while True跳出去了

        elif youinp

            a=youinp

break——这里就不能break,条件到这就直接退出if判断(else那同理)

        else:

            b=youinp

guess(9,1,100)

case4 打印n*n 乘法表

20210619思路——两层循环,难点在于 空格和换行(怎么纵向一直对齐呢?)end='\t'

def cheng(n):

    for i in range(1,n+1):

        for j in range(i,n+1):

            print('{}*{}={}'.format(i,j,i*j),end=' ')  ——end='\t' 一个占位符大概4个空格

        print('\n')

cheng(int(input('num\n')))

case5 任意区间内素数

思路20210619——除了本身及1外,若可整除,计数器+1,计数器=2的数才是素数,打印,否则略过且计数器清零

代码

def sushu(low,high):

    c=0

    global b

    b=0 #用来计有几个素数

    for i in range(low,high+1):

        for j in range(1,i+1):

            if i%j==0:

                c=c+1

        if c==2:

            print(i)

            c=0

            b=b+1

        else:  ——否则计数器清零也非常重要

            c=0

    return b

sushu(3,100)

print('有{}个素数'.format(b)) ——b变成 全局变量才能print,不然无法调用——但没有利用函数返回值,其实是利用 全局变量

sushu(5,299)

print('有{}个素数'.format(b))

hanshujieguo=sushu(3,100)

print('有{}个素数'.format(hanshujieguo)) #利用函数返回值输出

参考答案思路——也很巧妙——通过改flag状态(比我的节约资源)

代码

def find(low,high):

    for i in range(low,high+1):

        flag='yes'

        for j in range(2,i):

            if i%j==0:

                flag='no'

                break

        if flag=='yes':

            print(i)

find(1,100)

案例——输入用户名&密码,符合条件才存储密码

思路20210619——用三个函数,分别检查空用户名、检查密码尺寸、检查是否存储

代码——用到了global 声明全局函数,不然最后的save函数存储不了局部——不是的——不做global全局声明也可以,写在要使用的函数前面即可。

函数定义内的 局部函数,以局部优先。

具体代码

global a  ——可省略

a=input('username\n')

global b——可省略

b=input('pw\n')

def uncheck(a):

    #global a

    if a=="":

        return False

    else:

        return True

def namecheck(b):

    #global b

    if len(b)<6:

        return False

    else:

        return True

def save(c,d):

    #c=namecheck(a)

    #d=uncheck(b)

    dict={}

    if c and d:

        print('okd')

        dict[a]=b

    else:

        print('bukeyide')

    print(dict)

cinput=uncheck(a)

dinput=namecheck(b)

save(cinput,dinput)

参考答案思路——在最后save函数中 调用前面函数(在局部函数中可以调用其他局部函数咯?)

代码

# 检测用户名是否符合要求的函数

def uncheck(username):

    if len(username) == 0:

        return False

    else:       

        return True

# 检测密码是否符合要求的函数

def pwcheck(password):

    if len(password) >= 6:

        return True

    else:

        return False

# 第三步 保存函数

def save(username, password):

    # 用户名和密码都通过检测

    if uncheck(username) == True and pwcheck(password) == True: ——调用其他两个函数

        accounts[username] = password

        print("账号创建成功!")

    # 用户名或密码未通过检测

    else:

        print("账号创建失败。")

# 创建一个空字典用来保存用户名和密码

accounts = {}

# 现在试着保存三个账户名和密码

for i in range(3):

    username = input("请输入用户名:")

    password = input("请输入密码:")

    save(username, password)  ——调用其他两个函数

20210619 end

今日收获

后面健身去了没有继续

又对 变量(全局、局部、global)有了深刻的认识

代码撰写感觉比以前更加轻松了,也对案例有了更多自己的理解和思路。写起代码来也有点轻车熟路了,很多之前不太明白的内容,现在理解稍微深一些了。

常学常新

接下来

挑一挑入门书——20号看了豆瓣上的一些推荐

《python的入门到实战》这本基本和小象学院讲的这套一致,所以倒也不必买了。

《笨方法学python》是obe的教学思路,都是题,如果有钱还可以再买来巩固。——也可以牛客网等现成网站上刷一刷题。

以前觉得小象学院的内容讲得浅,但现在回过头来看一下就也还好。比较全了,其实跳出来看也比较成体系了。巩固几遍理论上说是可以去做实战项目了,可能库这块还不多?不知道是不是我还没涉及(目前只看到异常处理这)

刚才打完字右手中指在不自觉地抖动,观察了一会。看来还是要保护一下颈椎和腰椎,学习的路还很长,身体是革命的本钱。

既然没有更好的推荐,小象学院的课继续往下看下去吧~

你可能感兴趣的:(20210619 py函数 (复习))