1. 程式人生 > >day15生成器面試題和內建函式

day15生成器面試題和內建函式

1複習

# 迭代器和生成器
# 迭代器
    # 可迭代協議 —— 含有iter方法的都是可迭代的
    # 迭代器協議 —— 含有next和iter的都是迭代器
    # 特點
        # 節省記憶體空間
        # 方便逐個取值,一個迭代器只能取一次。
# 生成器 —— 迭代器
    # 生成器函式
        # 含有yield關鍵字的函式都是生成器函式
        # 生成器函式的特點
            #呼叫之後函式內的程式碼不執行,返回生成器
            #每從生成器中取一個值就會執行一段程式碼,遇見yield就停止。
            #
如何從生成器中取值: # for :如果沒有break會一直取直到取完 # next :每次只取一個 # send :不能用在第一個,取下一個值的時候給上個位置傳一個新的值 # 資料型別強制轉換 :會一次性把所有資料都讀到記憶體裡 # 生成器表示式 # (條件成立想放在生成器中的值 for i in 可迭代的 if 條件)

2作業

# 3.處理檔案,使用者指定要查詢的檔案和內容,將檔案中包含要查詢內容的每一行都輸出到螢幕
def check_file(filename,aim):
    with open(filename,encoding
='utf-8') as f: #控制代碼 : handler,檔案操作符,檔案控制代碼 for i in f: if aim in i: yield i g = check_file('1.複習.py','生成器') for i in g: print(i.strip()) <<< # 迭代器和生成器 # 生成器 —— 迭代器 # 生成器函式 # 含有yield關鍵字的函式都是生成器函式 # 生成器函式的特點 #呼叫之後函式內的程式碼不執行,返回生成器 #每從生成器中取一個值就會執行一段程式碼,遇見yield就停止。
#如何從生成器中取值: # 生成器表示式 # (條件成立想放在生成器中的值 for i in 可迭代的 if 條件)
def check_file(filename):
    with open(filename,encoding='utf-8') as f:   #控制代碼 : handler,檔案操作符,檔案控制代碼
        for i in f:
            if '迭代器' in i:
                yield '***'+i

for i in check_file('1.複習.py'):
    print(i.strip())
<<<
***# 迭代器和生成器
***# 迭代器
***    # 迭代器協議 —— 含有next和iter的都是迭代器
***        # 方便逐個取值,一個迭代器只能取一次。
***# 生成器 —— 迭代器

3面試題

def demo():
    for i in range(4):
        yield i
g=demo()
g1=(i for i in g)
g2=(i for i in g1)
print(list(g))
print(list(g1))
print(list(g2))
<<<
[0, 1, 2, 3]
[]
[]
def add(n,i):
    return n+i
def test():
    for i in range(4):
        yield i
g=test()
for n in [1,10,5]:
    g=(add(n,i) for i in g)
# n = 1
# g=(add(n,i) for i in test())  #g=(1,2,3,4)
# n = 10
# g=(add(n,i) for i in (add(n,i) for i in test())) # g=(11, 12,13 ,14)
# n = 5
# g=(15,16,17,18)
print(list(g))
<<<
[15, 16, 17, 18]

4內建函式

# print()
# input()
# len()
# type()
# open()
# tuple()
# list()
# int()
# bool()
# set()
# dir()
# id()
# str()
# print(locals())  #返回本地作用域中的所有名字
# print(globals()) #返回全域性作用域中的所有名字
# global 變數
# nonlocal 變數
#迭代器.__next__()
# next(迭代器)
            # def next(迭代器):
            #         迭代器.__next__()
# 迭代器 = iter(可迭代的)
# 迭代器 = 可迭代的.__iter__()

range

range(10)
range(1,11)
print('__next__' in dir(range(1,11,2)))
<<<
False

dir

# dir 檢視一個變數擁有的方法
print(dir([]))
print(dir(1))
<<<
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']

help

 
 
help(str)
<<<

class str(object)
| str(object='') -> str
| str(bytes_or_buffer[, encoding[, errors]]) -> str


 |  Create a new string object from the given object. If encoding or
 |  errors is specified, then the object must expose a data buffer
 |  that will be decoded using the given encoding and error handler.
 |  Otherwise, returns the result of object.__str__() (if defined)
 |  or repr(object).
 |  encoding defaults to sys.getdefaultencoding().
 |  errors defaults to 'strict'.
 |  
 |  Methods defined here:
 |  
 |  __add__(self, value, /)
 |      Return self+value.
 |  
 |  __contains__(self, key, /)
 |      Return key in self.|  
 |  __format__(...)
 |      S.__format__(format_spec) -> str
 |      
 |      Return a formatted version of S as described by format_spec.
| __hash__(self, /) | Return hash(self). | | __iter__(self, /) | Implement iter(self).| | __len__(self, /) | Return len(self).

collable

#callable 可呼叫的 檢測是不是一個函式
# 變數
print(callable(print))
a = 1
print(callable(a))
print(callable(globals))
def func():pass
print(callable(func))
<<<
True
False
True
True

time

import time  #( t = __import__('time'))
print(time.time())
<<<
1545206579.6000051 #1970年到現在經歷的秒數

writable

# 某個方法屬於某個資料型別的變數,就用.呼叫 list.__len__()
# 如果某個方法不依賴於任何資料型別,就直接呼叫  —— 內建函式 和 自定義函式

f = open('1.複習.py')
print(f.writable())
print(f.readable())
<<<
False
True
 
 

 print

#輸入輸出
# ret = input('提示 : ')
# print(ret)
def print(self, *args, sep=' ', end='\n', file=None): 
print('我們的祖國是花園',end='') #指定輸出的結束符 
print('我們的祖國是花園 ',end='') print(1,2,3,4,5,sep='|') #指定輸出多個值之間的分隔符
f = open('file','w')
print('aaaa',file=f) f.close() <<< 我們的祖國是花園我們的祖國是花園 1|2|3|4|5

 

 
 

hash 

#記憶體相關
#id
#hash - 對於相同可hash資料的hash值在一次程式的執行過程中總是不變的ab
#     - 字典的定址方式
print(hash(12345))
print(hash('hsgda不想你走,nklgkds'))
print(hash('hsgda不想你走,nklgkds'))
print(hash(('1','aaa')))
<<<
12345
-2573559241142890582
-2573559241142890582
4497054594156916011

print(hash([]))
會報錯 不可哈西

文字進度條

#列印進度條
import time
for i in range(0,101,2):
     time.sleep(0.1)
     char_num = i//2
     per_str = '\r%s%% : %s\n' % (i, '*' * char_num) \
         if i == 100 else '\r%s%% : %s' % (i,'*'*char_num)
     print(per_str,end='', flush=True)
#progress Bar
<<<
100% : **************************************************

exec和eval

exec('print(123)')
eval('print(123)')
print(eval('1+2+3+4'))   # 有返回值
print(exec('1+2+3+4'))   #沒有返回值
# exec和eval都可以執行 字串型別的程式碼
# eval有返回值  —— 有結果的簡單計算
# exec沒有返回值   —— 簡單流程控制
# eval只能用在你明確知道你要執行的程式碼是什麼
123
123
10
None
code = '''for i in range(1,5):
    print(i*'*')
'''
exec(code)
*
**
***
****

compile

code1 = 'for i in range(0,3): print (i)'  #流程類
compile1 = compile(code1,'','exec')
exec(compile1)

code2 = '1 + 2 + 3 + 4'
compile2 = compile(code2,'','eval')      #計算類
print(eval(compile2))

code3 = 'name = input("please input your name:")'
compile3 = compile(code3,'','single')     #互動式
exec(compile3) #執行時顯示互動命令,提示輸入
print(name)
# name #執行後name變數有值
<<<
0
1
2
10
please input your name:hhh
hhh

complex

# 複數 —— complex
#real+img j     實部和虛部都是浮點數 複數不能比較大小
# 5 + 12j  === 複合的數 === 複數
aa=123-12j
print aa.real  # output 實數部分 123.0  
print aa.imag  # output虛數部分 -12.0

浮點數

# 浮點數(有限迴圈小數,無限迴圈小數)  != 小數 :有限迴圈小數,無限迴圈小數,無限不迴圈小數
# 浮點數
    #354.123 = 3.54123*10**2 = 35.4123 * 10
f = 1.781326913750135970
print(f)
<<<

1.781326913750136

二 、八 、十六進位制

print(bin(10))
print(oct(10))
print(hex(10))
<<<
0b1010
0o12
0xa

divmod

print(abs(5)) #絕對值

print(divmod(7,2))   # div除法  mod取餘
print(divmod(9,5))   # 除餘
<<<
5
(3, 1)
(1, 4)

round和pow

print(round(3.14159,3))
print(pow(2,3))   #pow冪運算  == 2**3
print(pow(2,3,3)) #冪運算之後再取餘
print(pow(3,2,1))
<<<
3.142
8
2
0

sum

ret = sum([1,2,3,4,5,6])
print(ret)

ret = sum([1,2,3,4,5,6,10],)
print(ret)
<<<
21
31

min和max

print(min([1,2,3,4]))
print(min(1,2,3,-4))
print(min(1,2,3,-4,key = abs))
print(max([1,2,3,4]))
print(max(1,2,3,-4))
print(max(1,2,3,-4,key = abs))
<<<
1
-4
1
4
3
-4

ord chr

print("對應的ASCII 碼為", ord('a'))
print(" 對應的字元為", chr(65))
<<<
對應的ASCII 碼為 97
 對應的字元為 A

 

5試題講解

#元祖不能比較大小 字母可以
#while:True 永生語句
# print(2**10)  1024

 

#若k為整形,下列while迴圈執行的次數為:
k=1000
i=0
while k>1:
    i=i+1
    print (i,k)   #python2 中為9? 2**10=1024
    k=k/2
<<<
1 1000
2 500.0
3 250.0
4 125.0
5 62.5
6 31.25
7 15.625
8 7.8125
9 3.90625
10 1.953125
def qqxing(k,l={}):
    # l.append(1)
    l[k]='v'
    print(l)
qqxing(1)
qqxing(2)
qqxing(3)
qqxing(4,{})
<<<
{1: 'v'}
{1: 'v', 2: 'v'}
{1: 'v', 2: 'v', 3: 'v'}
{4: 'v'}

刪除重複元素

# 寫一段python程式碼實現刪除一個list裡面重複元素
list=[1,1,2,2,3]
new_list=[]
for i in list:
    if i not in new_list:
        new_list.append(i)  #比set好一點 set無序
print(new_list)
<<<
[1, 2, 3]