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的教学思路,都是题,如果有钱还可以再买来巩固。——也可以牛客网等现成网站上刷一刷题。 以前觉得小象学院的内容讲得浅,但现在回过头来看一下就也还好。比较全了,其实跳出来看也比较成体系了。巩固几遍理论上说是可以去做实战项目了,可能库这块还不多?不知道是不是我还没涉及(目前只看到异常处理这) 刚才打完字右手中指在不自觉地抖动,观察了一会。看来还是要保护一下颈椎和腰椎,学习的路还很长,身体是革命的本钱。 既然没有更好的推荐,小象学院的课继续往下看下去吧~